荷兰国旗问题
- 问题:给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于sum的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度为O(N)。由于荷兰的国旗是三个颜色刚好对应三个部分,因此也叫荷兰国旗问题。
- 思路:引入两个具有指向性的变量,分别指向数组开头和结尾。i从数组开头进行遍历,如果小于sum则与指向开头的变量互换,变量指向右移,i++;如果等于sum,则仅执行i++;如果大于sum,则与指向结尾的变量互换位置,变量指向左移,不执行i++操作。重复执行,直到i 与 右边的指向变量重合。
代码实现
package LeetCode;
public class DutchFlag {
public static void dutchFlag(int[] arr, int num){
int left, right, i,temp;
left = i = 0;
right = arr.length - 1;
while (i != right){
if(arr[i] < num){
temp = arr[i];
arr[i] = arr[left];
arr[left] = temp;
left++;
i++;
}
if (arr[i] == num)
i++;
if (arr[i] > num) {
temp = arr[i];
arr[i] = arr[right];
arr[right] = temp;
right--;
}
}
}
public static void main(String[] args) {
int[] arr = new int[]{2,3,4,8,10,1,13,34,14,13,20,7};
dutchFlag(arr,13);
for(int i : arr){
System.out.println(i);
}
}
}