一、题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
二、解题思路
方法一:两次遍历
思路:
1、第一次遍历把非0数归位
2、第二次遍历把所有0归位
代码:
public void moveZeroes(int[] nums) {
int zeroNum = 0;
//把非0的数放在前面
for(int i = 0;i < nums.length;i++){
if(nums[i] != 0) nums[zeroNum++] = nums[i];
}
//把0放在最后面
for(int i = zeroNum;i < nums.length;i++){
nums[i] = 0;
}
}
复杂度分析:
1、时间复杂度:O(n) 两次遍历
2、空间复杂度:O(1) 无额外空间
方法二:双指针
思路:
右指针指向的非0元素与左指针指向的元素交换
交换后左指针右移
代码:
public void moveZeroes(int[] nums) {
int left=0,right=0;
while(right<nums.length){
//右指针的数不为0,与左边交换
if(nums[right] != 0){
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
//交换完左指针右移
left++;
}
right++;
}
}
复杂度分析:
1、时间复杂度:O(n)
2、空间复杂度:O(1)