荷兰国旗问题

问题描述:给定一个数组arr,和一个数num,请把小于num的数放在数组的 左边,等于num的数放在数组的中间,大于num的数放在数组的 右边。 要求额外空间复杂度O(1),时间复杂度O(N)

问题分析:这部分其实和快排中的partition部分很相似,其思想就是将任意一个数组分成三部分,分别是小于 等于 大于 某个num的数组

public class code_08_NetherlandsFlag {
    public static int[] partition(int[] arr, int l ,int r ,int num){
        int less = l - 1;
        int more = r + 1;

        int index = l;
        while (index < more)
        {
            if(arr[index] < num){
                swap(arr ,++less,index++ );
            }
            else if(arr[index] > num)
            {
                swap(arr ,--more,index );
            }
            else{
                index ++;
            }
        }
        return new int[] {less + 1 ,more -1 };
    }

    public static void swap(int[] arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

 

版权声明:本文为zhang-liubai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhang-liubai/p/14891007.html