开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
有 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.length1 <= n <= 2000boxes[i]为'0'或'1'
二、思路分析
这一题不需要想的过于复杂,最简单的就是双循环来算出所有球移动到每一个盒子时所需的最小操作数。刚开始我还在想,会不会有什么特殊情况需要考虑。其实是多想了,无论什么情况,一个小球从盒子i移动到盒子j都需要(i-j)步。
还有一种思路是先算出将所有小球移动到第一个盒子所需的操作数,那么把所有小球移动到第二个盒子所需的操作数就是上一个盒子的操作数加上第一个盒子所有的右边的小球再减去第一个盒子左边的所有小球。这种思路在时间复杂度上降低了,但编程就复杂了一点。
三、AC代码
class Solution {
public:
vector<int> minOperations(string boxes) {
vector<int>answer;
int sum=0;
for(int i=0;i<boxes.size();i++){
sum=0;
for(int j=0;j<boxes.size();j++){
if(boxes[j]=='1'){
sum=sum+abs(i-j);
}
}
answer.push_back(sum);
}
return answer;
}
};
提交排名
四、总结
掌握了该题的两种思路。