给定一个数组,再给定一个值,将小于该值的数字放到数组的左边(可能是无序的),将等于该值的数字放到数组中间,将大于该值的数字放到数组右边,可以无序。
返回给定值的左边界和右边界。

image.png

题解:
1、首先,我们设定小于区域的右边界为less,大于区域的左边界为more,数组的左边界为L,数组的右边界为R。初始化小于区域的右边界为L-1,初始化大于区域的左边界为R。
2、我们将给定值固定为数组右边界的值,保证给定值是数组中有的值。
3、当前位置的数等于给定值,当前位置向右移动1;
4、当前位置的数小于给定值,当前位置与小于区域的右边一个值交换,小于区域的位置向右移动1,当前位置向右移动1;
5、当前位置的数大于给定值,当前位置的数与大于区域左边的数交换,大于区域的位置向左移动1,当前位置不变。

未命名文件 47.png

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];
    }
}