给定一个数组,再给定一个值,将小于该值的数字放到数组的左边(可能是无序的),将等于该值的数字放到数组中间,将大于该值的数字放到数组右边,可以无序。
返回给定值的左边界和右边界。
题解:
1、首先,我们设定小于区域的右边界为less,大于区域的左边界为more,数组的左边界为L,数组的右边界为R。初始化小于区域的右边界为L-1,初始化大于区域的左边界为R。
2、我们将给定值固定为数组右边界的值,保证给定值是数组中有的值。
3、当前位置的数等于给定值,当前位置向右移动1;
4、当前位置的数小于给定值,当前位置与小于区域的右边一个值交换,小于区域的位置向右移动1,当前位置向右移动1;
5、当前位置的数大于给定值,当前位置的数与大于区域左边的数交换,大于区域的位置向左移动1,当前位置不变。
package com.example.springboot;
import java.util.Stack;
public class MyStack {
public int[] netherlandsFlag(int[] arr,int l,int r){
if(l>r){
return new int[] {-1,-1};
}
if(l==r){
return new int[]{l,r};
}
//初始化小于区域右边界,大于区域左边界,当前值
int less=l-1;
int more=r;
int index=l;
while (index<more){
if(arr[index]==arr[r]){
index++;
}else if(arr[index]<arr[r]){
//如果当前值小于给定值时,当前值与小于区域右边界右边的数交换,当前值向右移动一个位置,小于区域右边界向右移动一个
swap(arr,++less,index++);
}else {
//如果当前值大于给定值,当前值与大于区域左边界左边的第一个数交换,大于区域的左边界向左移动1
swap(arr,--more,index++);
}
}
//当前位置与大于区域的左边界撞上时,当前位置的数与数组最右边的交换
swap(arr,more,r);
return new int[] {less+1,more};
}
public void swap(int[] arr,int i,int j){
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
}