荷兰国旗问题

108 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

提供一个数组和一个目标数

提供一个方法将数组划分为三个区域,前面是小于目标数的,中间是等于目标数的,后面是大于目标数的。

思路

这个题目我们可以创建边界来解决。

设定一个变量less表示小于目标数的区域less = -1

设定一个变量more表示大于目标数的区域more = arr.length

设定一个变量cur是指向一个数的 cur = 0;

假设1:我们用cur这个数,他是大于目标数的,那么就把这个数和more数的前面一个数交换,然后more--;

假设2:如果cur这个数,是小于目标数的,那我们就和less的后面一个数交换,然后less++;cur++;

假设3:如果cur这个数,是等于目标数的,那我们就不动,让cur++

举例

数组【2,5,8,9,0,4,1】

目标数4

less = -1;

more = 7;

cur = 0;

第一次 arr[cur] = 2

发现是小于目标数的那就执行假设2

数组就变成【2,5,8,9,0,4,1】

less = 0;

cur = 1;

第二次 arr[cur] = 5

发现是大于目标数的那就执行假设1

数组就变成【2,1,8,9,0,4,5】 more = 6

cur = 1

就这样一直循环直到cur > more

代码

public static void netherlandsFlag(int[] arr , int aim){
    int less = -1;
    int more = arr.length;
    int cur = 0;
    while(cur < more){
        if(arr[cur] < aim){
            swap(arr , cur++ , ++less);
        }else if(arr[cur] > aim){
            swap(arr , cur , --more);
        }else{
            cur++;
        }
    }
}

以上就是所有代码