算法训练篇01 -- 力扣283.移动零
这是小生,第一次写关于算法题目的博客,有什么写的不好的地方,希望各位佬可以在评论区写下需要修改的地方,我包听话的
目录
1.题目链接:283.移动零
2.题目描述:
3.解法(快排思想:数组划分区域)
4.C++算法代码
5.算法总结
1.题目链接:283.移动零
2.题目描述:
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =[0,1,0,3,12]
输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]
输出:[0]
3.解法(快排思想:数组划分区域)
算法思路:
在本题,我们用两个指针,一个cur,一个dest。cur指针来扫描整个数组,dest指针用来记录非零数序列的最后一个位置。在cur的扫描过程中,我们将数组分成三个区域:
算法流程:
- 初始化cur = 0,dest = -1(用来指向非零元素序列的最后一个位置。因为刚开始我们不知道最后一个非零元素在什么位置,因此初始化为-1)
- cur遍历的过程我们分为两种情况:
a.当cur遇到的元素是0:直接让cur++。因为我们[dest+1,cur-1]的区域都是0 b.当cur遇到非0的元素:直接让dest++(dest是非零元素的最后一个位置,所以dest++可以使得dest指向第一个0),然后用sort函数,使dest和cur位置的元素交换。再让cur++继续扫描数组。
4.C++算法代码
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int cur = 0, dest = -1;
while(cur<nums.size())
{
if(nums[cur] != 0)
{
dest++;
swap(nums[dest],nums[cur]);
}
cur++;
}
}
};
5.算法总结
这个方法是快排算法中,数据划分过程的重要一步。如果将快排算法拆解的话,这一段小代码就是实现快排算法的核心步骤