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 }