算法-每日一题(DAY1)移动零

1.题目链接:

283. 移动零 - 力扣(LeetCode)

2.题目内容:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

提示:

1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1

3.解题思路

本题使用双指针的思想,使用两个变量L(左指针)和R(右指针),左指针L用于指向当前已经处理好的非零序列的下一个位置,也就是下一个非零元素应该放置的位置,而右指针R用于遍历数组。当右指针所遍历的数组元素为零时,则继续遍历下一个元素;若右指针遍历的元素不为零时,则将左指针和右指针所指向的数组元素交换,确保此时左指针所指向的数组元素是非零元素,随后让左指针指向已经整理好的非零序列的下一个位置,而右指针则继续向下一位遍历,直到遍历完整个数组,数组中的非零元素都被移动到了数组的前部(相对顺序不变),而零则被移动到了数组后部。注意要让右指针R小于数组的长度,这样当R从0开始一直增加到nums.size()时,就可以遍历完整个数组。

算法-每日一题(DAY1)移动零_第1张图片

4.题解代码

class Solution {
public:
   void moveZeroes(vector& nums) 
{
	int L = 0, R = 0;
	while (R < nums.size())
	{
		if (nums[R] == 0)
		{
			R++;
		}
		else swap(nums[R++], nums[L++]);
		
	}
}
};

5.示例演算

输入:nums=[0,1,0,3,12]
执行过程

步骤 L R 操作 数组状态
1 0 0 nums[0]=0 → R++ [0,1,0,3,12]
2 0 1 交换 nums[1]↔nums[0] [1,0,0,3,12]
3 1 2 nums[2]=0 → R++ [1,0,0,3,12]
4 1 3 交换 nums[3]↔nums[1] [1,3,0,0,12]
5 2 4 交换 nums[4]↔nums[2] [1,3,12,0,0]

6.复杂度分析

时间复杂度:循环次数 n × 单步操作 O(1)= O(n)

空间复杂度:空间开销不随 n 扩大而增长,故空间复杂度为O(1)

你可能感兴趣的:(数据结构与算法-每日一题,算法,数据结构,c++,面试,leetcode)