来点强调,刷题是按照代码随想录的顺序进行的,链接如下https://www.programmercarl.com/
本系列是记录一些刷题心得和学习过程,就看到题目自己先上手试试,然后看程序员Carl大佬的解释,自己再敲一遍修修补补,练题的小伙伴还是跟着大佬的解释比较系统
每日碎碎念
苦痛生活继续
hello LeetCode,今天还是数组移动元素专项刷题…
一、题目要求及测试点
283 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
链接https://leetcode.cn/problems/move-zeroes/description/
测试点
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示
- 1 <= nums.length <= 1 0 4 10^4 104
- - 2 31 2^{31} 231 <= nums[i] <= 2 31 − 1 2^{31} - 1 231−1
二、题解
自己上手
代码如下:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int slowIndex = 0;
int fastIndex = 0;
for (; fastIndex < nums.size(); fastIndex++){
if (nums[fastIndex] != 0){
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
while (slowIndex < nums.size()){
nums[slowIndex] = 0;
slowIndex++;
}
}
};
来点无用总结:
时间复杂度O(n),比之前多了个填充0的操作…设想过再搞一个指针从末尾专门填0…这个想法被证明不能同时搞3个指针,因为方向不一致可能会修改有用的值
三、总结
1.相较于标准双指针,把后面数据清零了;
3.识别可用双指针题型。