283. 移动零

https://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&envId=top-100-liked

使用双指针法:index_0指向第一个零的位置,index_not_0指向第一个非零的位置。当找到非零元素且在零元素之后时,交换两者值,并更新index_0指向下一个零。时间复杂度O(n),空间复杂度O(1),通过原地交换实现零元素后移,保持非零元素相对顺序不变。

func moveZeroes(nums []int)  {
	index_0 := 0 // 用于指向第一个0的位置
	for index_0 < len(nums) && nums[index_0] != 0 {
		index_0++
	}
	index_not_0 := 0 // 用于指向第一个非0的位置
	for index_not_0 < len(nums) && nums[index_not_0] == 0 {
		index_not_0++
	}
	for index_not_0 < len(nums) {
		if nums[index_not_0] != 0 && index_not_0 > index_0 {
			tmp := nums[index_not_0]
			nums[index_not_0] = nums[index_0]
			nums[index_0] = tmp
			// index_0要找到下一个0的位置
			for index_0 < len(nums) && nums[index_0] != 0 {
				index_0++
			}
		}
		index_not_0++ // 无论如何都要向前推进
	}
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值