本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
提供一个数组和一个目标数
提供一个方法将数组划分为三个区域,前面是小于目标数的,中间是等于目标数的,后面是大于目标数的。
思路
这个题目我们可以创建边界来解决。
设定一个变量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++;
}
}
}
以上就是所有代码