LeetCode283 移动零
题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
方法
双指针法
从头分别找到第一个0和之后第一个非0的数进行交换,然后依次往下找0和非0数交换,即把数组看出非零数组和零数组,从头依次交换直至所有的零都在后面
- 时间复杂度:O(n)
- 空间复杂度:O(1)
class Solution {
public void moveZeroes(int[] nums) {
int str0 = 0; //为0的指针
int str1 = 0;//不为零的指针
while (str1<nums.length){
while (str0<nums.length&&nums[str0]!=0){
str0++;
}
str1 = str0;
while (str1<nums.length&&nums[str1]==0){
str1++;
}
if(str1<nums.length){
int tmp = nums[str0];
nums[str0] = nums[str1];
nums[str1] = tmp;
}
}
}
}
class Solution {
public void moveZeroes(int[] nums) {
int length = nums.length,left=0,right=0;
while(right<length){
if(nums[right]!=0){
swap(nums,left,right);
left++;
}
right++;
}
}
private void swap(int[] nums,int i,int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
class Solution {
public void moveZeroes(int[] nums) {
int length = nums.length;
if(nums==null||nums.length<=1) return;
for(int l=0,r=0;r<length;r++){
if(nums[r]!=0){
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
l++;
}
}
}
}