【LeetCode】数组类算法:移动零

01、目录

02、问题描述

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

  • 示例:

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

  • 说明:

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

03、思路

可以使用双类似双指针的办法,一个指针移动,另一个指针负责记录。
即先记录最后一个的位置,赋给两个变量。然后从后往前挨个遍历,知道遇到零,就记录差值,将差值中的数移位,最后将记录位置的下标对应的位置置0,重复,直到遍历完整个数组。

下面来看看代码实现吧,这里用C和C++都实现一遍。

04、代码实现

4.1 C语言版
void moveZeroes(int* nums, int numsSize)
{
	int Flag1 = sizeof(nums)/sizeof(*nums) -1;
	int Flag2 = sizeof(nums)/sizeof(*nums) -1;
	
	while(Flag1 >= 0)
	{
		if(nums[Flag1] == 0)
		{
			for(int i = 0; i < (Flag2 - Flag1); i++)
			{
				nums[Flag1 + i] = nums[Flag1 + i + 1];
			}
			nums[Flag2] = 0; //最后一个置0
			Flag2--; //前面覆盖掉一个,所以移动一位
		}
		Flag1--; //这里是移动Flag,直到遍历完整个数组
	}
}
4.2 C++版

这里我用同样的思路写一遍C++的,然后提供另外一种思路,借鉴的,比我这种思路要优化得更好。

同思路版:

class Solution {
public:
    void moveZeroes(vector<int>& nums)
    {
        int Flag1 = nums.size() - 1;
        int Flag2 = nums.size() - 1;

		while(Flag1 >= 0)
		{
			if(nums[Flag1] == 0)
			{
				int val = Flag2 - Flag1;
				for(int i = 0; i < val; i++)
				{
					nums[Flag1 + i] = nums[Flag1 + i + 1];
				}
				nums[Flag2] = 0;
				Flag2--;
			}
			Flag1--;
		}
    }
};

不同思路版

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

在这里插入图片描述
这个版本确实比上个版本好了太多,内存时间复杂度也更优。

05、小结

其实通过刷题,就可以明白一个道理,刷题不是我们的目的,我们的目的是通过刷题,扩展自己的思维。
比如这道题我确实想到了解题的思路,而且也通过思路思想了结果,但是运行的时候难免有些沮丧,排名还是很有激励作用的。

所以我就去查啊,查啊,就找到了比我的思路更优的解法。然后慢慢悟,突然就明白了,这不就是我们要得效果嘛,下次如果遇到类似的,你是不是会印象深刻的想到当初怎么怎么。思维不就有了吗。

版权声明:转载请注明出处,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cain Xcy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值