leetcode 75. Sort Colors
one pass solution.要求一次遍历即完成排序。
思路:设置两个指针(zeros和twos)指向数组的头部(-1)和尾部(nums.length)。用索引i遍历整个数组,找到0即放到数组左边,指针zeros向右移动1位;找到2即放在数组右边,twos向左移动1位。
注意点:
1、i从0遍历到twos,而不是从0遍历到nums.length。
因为twos即twos右边均为2,i在这一部分每次都会将已经排好都2放到twos以左,导致0,0,0,....,2,2,2,...,1,1,1之类的情况出现
2、当找到2时,将twos左边的数和i交换,twos = twos - 1之后,还要注意此时i不能向右移动,因为此时索引i处的元素是交换过后新得到的,需要进行判断和处理。
1 public void sortColors(int[] nums) { 2 if(nums == null || nums.length < 1) return; 3 int zeros = -1, twos = nums.length; 4 for(int i = 0; i < twos; i++) { 5 if(nums[i] == 0) { 6 nums[i] = nums[++zeros]; 7 nums[zeros] = 0; 8 } else if(nums[i] == 2) { 9 nums[i] = nums[--twos]; 10 nums[twos] = 2; 11 i--; 12 } 13 } 14 }