image.png

解题思路

双指针

上面的算法对于整个数组都是分0元素的情况下,需要非0元素自己与自己交换,浪费时间。
可以考虑当前指针和非0元素指针不相等的情况才进行交换,否则只是更改非0元素指针

  1. public void moveZeroes(int[] nums) {
  2. int k = 0; // nums中, [0...k)的元素均为非0元素
  3. // 遍历到第i个元素后,保证[0...i]中所有非0元素
  4. // 都按照顺序排列在[0...k)中
  5. // 同时, [k...i] 为 0
  6. for(int i = 0 ; i < nums.length ; i ++)
  7. if(nums[i] != 0)
  8. if(k != i)
  9. swap(nums, k++, i);
  10. else
  11. k ++;
  12. }
  13. private void swap(int[] nums,int i,int j){
  14. int temp = nums[i];
  15. nums[i]=nums[j];
  16. nums[j]=temp;
  17. }