[LeetCode 1769]移动所有球到每个盒子所需的最小操作数

news/2024/11/15 0:50:23/

题目描述

题目链接:[LeetCode 1769]移动所有球到每个盒子所需的最小操作数

有 n 个盒子。给你一个长度为 n 的二进制字符串 boxes ,其中 boxes[i] 的值为 ‘0’ 表示第 i 个盒子是 空 的,而 boxes[i] 的值为 ‘1’ 表示盒子里有 一个 小球。

在一步操作中,你可以将 一个 小球从某个盒子移动到一个与之相邻的盒子中。第 i 个盒子和第 j 个盒子相邻需满足 abs(i - j) == 1 。注意,操作执行后,某些盒子中可能会存在不止一个小球。

返回一个长度为 n 的数组 answer ,其中 answer[i] 是将所有小球移动到第 i 个盒子所需的 最小 操作数。

每个 answer[i] 都需要根据盒子的 初始状态 进行计算。

示例1

输入:boxes = “110”
输出:[1,1,3]
解释:每个盒子对应的最小操作数如下:

  1. 第 1 个盒子:将一个小球从第 2 个盒子移动到第 1 个盒子,需要 1 步操作。
  2. 第 2 个盒子:将一个小球从第 1 个盒子移动到第 2 个盒子,需要 1 步操作。
  3. 第 3 个盒子:将一个小球从第 1 个盒子移动到第 3 个盒子,需要 2 步操作。将一个小球从第 2 个盒子移动到第 3 个盒子,需要 1 步操作。共计 3 步操作。

示例2

输入:boxes = “001011”
输出:[11,8,5,4,3,4]

提示

  • n == boxes.length
  • 1 <= n <= 2000
  • boxes[i] 为 ‘0’ 或 ‘1’

思路分析

1.boxes.length <= 2000, 那么如果算法复杂度为O(n2n^2n2),大约为10610^6106,是可以暴力通过的,这是方法1

2.那么要在n2n^2n2的基础上进行突破,就需要将复杂度降低到O(n log n)或者O(n)的级别

我们可以从左右两个方向来讨论,首先是左侧,如图所示,假如当前遍历到了红色结点,这个结点的坐标为i,他的左边有两个结点:

在这里插入图片描述
那么把左边两个结点都移动到i位置所需要的代价就是T1 + T2

T1 与 T2不好计算,所以我们计算两个结点到左端点的距离,L1 和 L2

而L1 + T1 = i, L2 + T2 = i,

因此T1 + T2 = 2 * i - (L1 + L2)

依次类推要计算T1 + T2 + … + Tn = n * i - (L1 + L2 + L3 + … + Ln)

所以我们记录每个时刻的(L1 + L2 + … + Ln) 以及 n为多少,就可以计算左边所有结点到当前结点的代价了。

同理,右侧结点也是一样。

代码1(暴力)

class Solution {
public:vector<int> minOperations(string boxes) {int n = boxes.size();vector<int> res(n);unordered_set<int> st;for(int i = 0; i < n; i++) {if(boxes[i] == '1') st.insert(i);}for(int i = 0; i < n; i++) {int cnt = 0;for(auto t : st) {cnt += abs(t - i);}res[i] = cnt;}return res;}
};

代码2

class Solution {
public:vector<int> minOperations(string boxes) {int n = boxes.size();//l[i]存储i结点左边所有结点到i的代价,r[i]同理vector<int> l(n), r(n), res(n);int cnt = 0, len = 0;for(int i = 0; i < n; i++) {l[i] = i * cnt - len;//如果当前结点为1,那么len要加上i,同时结点数++if(boxes[i] == '1') len += i, cnt++;}cnt = 0, len = 0;for(int i = n - 1; ~i; i--) {r[i] = (n - i - 1) * cnt - len;if(boxes[i] == '1') len += (n - i - 1), cnt++;}for(int i = 0; i < n; i++) res[i] = l[i] + r[i];return res;}
};

运行用时

执行用时缩短了39 / 40
在这里插入图片描述


http://www.ppmy.cn/news/928.html

相关文章

【Vue脚手架项目的结构】

目录 1. 关于VUE Cli 2. 修改VUE Cli项目的端口号 3. Vue脚手架项目的结构 4. 关于标签 5. 关于路由配置 6. 关于视图组件 7. 应用Element UI 1. 关于VUE Cli VUE Cli&#xff1a;Vue脚手架 在Vue脚手架项目中&#xff0c;使用的是“单页面”的设计模式&#xff0c;也就…

傻妞旧版合集新版订阅

目录一、前言二、下载三、新版傻妞订阅合集一、前言 傻妞旧版本(合集),包含amd和arm版本收集于TG 我的是amd架构 [rootecs-mike_note ~]# cat /proc/version Linux version 4.11.8-1.el7.elrepo.x86_64 (mockbuildBuild64F25) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11…

ch2_2系统调用的实现

1. 为什么存在系统调用 起因&#xff0c; 应用程序 运行时在内存中&#xff0c;操作系统也在内存中&#xff0c; 为什么应用程序想访问 操作系统的提供的功能函数&#xff0c; 为什么不能 直接去取从内存中去取呢&#xff1f; 答&#xff1a; 操作系统是一个重要的存在&…

弱鸡记录一道模拟题

前言&#xff1a; 这不能算是题解&#xff0c;只是日记笔记而已 如果您想看正经规范的题解&#xff0c;请移步 题解 最近女赛寄了&#xff0c;并不是因为队员的原因&#xff0c;因为疫情?? 我们组没能凑齐最终上场的队员&#xff0c;最后相当于是两个菜鸡上的&#xff0c;我另…

MR直播实例(混合现实直播)高品质企业直播

阿酷TONY / 2022-12-2 / 长沙 / 超多组图 绿幕抠像 虚拟场景&#xff08;三维场景&#xff09;实时渲染&#xff0c;降低直播成本&#xff0c;带来线下活动所没有的沉浸式视听体验。 虚拟舞台场景介绍参见&#xff1a; 企业年会直播来个虚拟舞台场景如何&#xff1f;_阿…

springMVC02,restful风格,请求转发和重定向

springMVC02,restful风格,请求转发和重定向restful风格restful简介restful 例子测试请求转发和重定向restful风格 restful简介 概念: Restful就是一个资源定位及资源操作的风格。不是标准也不是协议&#xff0c;只是一种风格。基于这个风格设计的软件可以更简洁&#xff0c;…

Sqli-Libs 速通

Sqli-Libs持续更新...目标Less-1Less-2Less-3Less-4Less-5Less-6Less-7Less-8Less-9Less-10Less-11Less-12Less-13Less-14Less-15Less-16Less-17Less-18Less-19 bp处理Less-20目标 直接写payload&#xff0c;sql语句非预期执行就算成功 表&#xff1a;emails,referers,uagent…

纳尼?华为首席架构师只用434页笔记,就将网络协议给拿下了

不管是前端还是后端&#xff0c;几乎所有的程序运行都会涉及到网络协议。10 个程序员里面&#xff0c;10 个都说自己学过网络协议&#xff0c;9 个说自己懂网络协议。但真正面试的时候&#xff0c;能回答出相关问题的&#xff0c;可能只有两三个。 金九银十跳槽热季&#xff0…