给定一个数组
nums
,编写一个函数将所有0
移动到数组的末尾,同时保持非零元素的相对顺序。示例:
输入:[0,1,0,3,12]
输出:[1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
思路:
定义 双指针 left,right。left左侧的数都是非零值,而right则不断的右移以跟踪0值。
如果nums[right] != 0,则left和right对应值交换,且left和right都右移;反之则仅仅right右移
时间复杂度:O(n)
空间复杂度:O(1)
Go版本:
// 定义 双指针 left,right。left左侧的数都是非零值,而right则不断的右移以跟踪0值。
// 如果nums[right] != 0,则left和right对应值交换,且left和right都右移;反之则仅仅right右移
func moveZeroes(nums []int) {
left, right := 0, 0
for right < len(nums) {
if nums[right] != 0 {
nums[left], nums[right] = nums[right], nums[left]
left++
}
right++
}
}
C++版本:
// 1.精简版
void moveZeroes(vector<int>& nums) {
int left, right; // left:慢指针 right:快指针
for (left = 0, right = 0; j < nums.size(); right++)
{
if (nums[right] != 0)
{
swap(nums[left++], nums[right]);
}
}
}
自己写的原版不够精简 = = !:
// 2.冗余版
void moveZeroes(vector<int>& nums) {
int left = 0;
int right = 0;
while (right < nums.size())
{
if (nums[right] == 0)
{
right++;
}
else
{
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
right++;
}
}
}