14.2:荷兰国旗问题加强版:分3区域

14.2:荷兰国旗问题:分3区域

分3区域、<X 放左边,X放中间, >X放右边

 

例子:

  <)[  3,   4,   6,   0,   7,   4,   5,   1,   3  ](>                  目标数:4

 

1、当前数  <  目标数,当前数和小于区的下一个数交换,小于区右括,当前数跳下一个。

 

2、当前数 == 目标数,当前数直接跳下一个。

 

3、当前数  >  目标数,当前数和大于区的前一个数交换,大于区左括,当前数停在原地。

 

当前数撞到右边界的时候结束。

 

 

 1 public static int[] netherlandsFlag(int[] arr, int L, int R) {
 2         if (L > R) { // L...R L>R
 3             return new int[] { -1, -1 };
 4         }
 5         if (L == R) {
 6             return new int[] { L, R };
 7         }
 8         int less = L - 1;      // < 区 右边界
 9         int more = R;          // > 区 左边界,最后一个数不参与
10         int index = L;
11         while (index < more) { // 当前位置,不能和 >区的左边界撞上
12             if (arr[index] == arr[R]) {
13                 index++;
14             } else if (arr[index] < arr[R]) {
15 //                swap(arr, less + 1, index);         //和小于区域下一数交换
16 //                less++;                             //小于区域右括
17 //                index++;                            //当前数跳下一个
18                 swap(arr, index++, ++less);
19             } else { // >
20                 swap(arr, index, --more);
21             }
22         }
23         swap(arr, more, R);        // <[R]   =[R]   >[R]
24         return new int[] { less + 1, more };
25     }

 

posted @ 2022-05-22 11:09  yzmarcus  阅读(31)  评论(0编辑  收藏  举报