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 }

 

posted @ 2018-10-16 21:10  起点菜鸟  阅读(148)  评论(0编辑  收藏  举报