【LeetCode】283.移动零

  • Post author:
  • Post category:其他




问题描述

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

示例:

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

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

来源:力扣(LeetCode)

链接:

https://leetcode-cn.com/problems/move-zeroes


著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。



法I:其实是个非常拧巴的方法

//移动零
class Solution {
public:
	void moveZeroes(vector<int>& nums) {
		int preLeft = 0;
		int preRight = 0;//记录这一组0的左右边界:[preLeft,preRight)
		int cur = 0;
		while (cur < nums.size()) {
			if (nums[cur] == 0) {
				int countN0 = cur - preRight;
				while (countN0 > 0) {
					swap(nums[preLeft], nums[preRight]);
					preLeft++;
					preRight++;
					countN0--;
				}
				preRight = cur + 1;
			}
			cur++;
		}
		cur = nums.size() - 1;
		while (preRight < nums.size()) {
			swap(nums[preLeft], nums[preRight]);
			preLeft++;
			preRight++;
		}
	}
};

在这里插入图片描述



法II:常规(双指针)

class Solution {
public:
	void moveZeroes(vector<int>& nums) {
		int preLeft = 0;
		for (int i = 0; i < nums.size(); i++) {
			if (nums[i] != 0) {
				swap(nums[preLeft], nums[i]);
				preLeft++;
			}
		}
	}
};

在这里插入图片描述



版权声明:本文为weixin_44204879原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。