题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
1.必须在原数组上操作,不能拷贝额外的数组。
2.尽量减少操作次数。
算法思路:
1. 双指针
- 设置两个指针,一个为快指针,目的是为了提前查找不为零的数;另一个为慢指针,目的是为了得到非零元素的相对顺序
- 遍历数组,快指针依次指向数组的每一个元素,遇到0就计数,计数是为了在后面补齐零
- 快指针遇到非0就将该元素赋值到慢指针所指向的位置
- 遍历结束后,依次补齐后面的所有0
代码实现
public void moveZeroes(int[] nums) {
int left = 0;
int right = 0;
int count = 0;
int length = nums.length;
while(right < length){
if(nums[right] != 0){
nums[left++] = nums[right++];
}else{
count++;
right++;
}
}
while(count > 0){
nums[length - count] = 0;
count--;
}
}
public void moveZeroes_2(int[] nums) {
int left = 0;
int right = 0;
while(right < nums.length){
if(nums[right] != 0){
swap(nums,left,right);
left++;
}
right++;
}
}
private void swap(int[] nums, int left, int right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
复杂度分析:
- 时间复杂度:O(n),其中n为数组nums的长度
- 空间复杂度:O(1)