一:解题思路
方法一:使用快慢游标法,慢游标指向非零元素的插入位置,快游标指向非零元素。如果快游标指向零元素,则向后移动一位,否则将快游标所指向的元素赋值给慢游标所指向的元素。
方法二:同样使用快慢游标法,当快游标指向零元素的时候,向后移动一个位置,当遇到指向不为零的元素的时候,与慢游标指向的元素进行相互交换。
上述2种方法的Time:O(n),Space:O(1)
二:完整代码示例 (C++版和Java版)
方法一C++:
class Solution { public: void moveZeroes(vector<int>& nums) { if (nums.size() == 0) return; int slow = 0; for (int fast = slow; fast < nums.size(); fast++) { if (nums[fast] != 0) { nums[slow++] = nums[fast]; } } while (slow < nums.size()) { nums[slow++] = 0; } } };
方法一Java:
class Solution { public void moveZeroes(int[] nums) { if(nums==null||nums.length==0) return; int slow=0; for(int fast=slow;fast<nums.length;fast++) { if(nums[fast]!=0) { nums[slow++]=nums[fast]; } } while(slow<nums.length) { nums[slow++]=0; } } }
方法二C++:
class Solution { public: void swap(int& a, int& b) { int c = a; a = b; b = c; } void moveZeroes(vector<int>& nums) { if (nums.size() == 0) return; int slow = 0; for (int fast = slow; fast < nums.size(); fast++) { if (nums[fast] != 0) { swap(nums[slow++],nums[fast]); } } } };
方法二Java:
class Solution { public void moveZeroes(int[] nums) { if(nums==null||nums.length==0) return; int slow=0; for(int fast=slow;fast<nums.length;fast++) { if(nums[fast]!=0) { int temp=nums[fast]; nums[fast]=nums[slow]; nums[slow]=temp; slow++; } } } }