荷兰国旗

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

思路:从l到r遍历,

  当curr = num , 不动 走下一个

  当curr < num , curr和less 的后一个做交换 

  当 curr > num , curr 和 more 的前一个作交换(curr不忘后走,待定数)

 

package my_basic;

public class NetherlandsFlag {
    
    public static int[] partition(int[] arr, int l, int r, int num) {
        
        int less= l-1;
        int more = r+1;
        while (l < more) {
            if (arr[l] < num) {
                swap(arr, ++less, l++);
            }else if (arr[l]>num) {
                swap(arr,--more,l);
            }else {
                l++;
            }
        }
        
        return new int[] {less + 1 , more - 1};
    }
    
    
    private static void swap(int[] arr, int i, int j) {
        int tmp;
        tmp = arr[i];
        arr[i]=arr[j];
        arr[j]=tmp;        
    }

    //对数器
    public static int[] generateRandomArray(int maxSize,int maxValue) {
        int[] arr = new int[(int) ((maxSize+1)*Math.random())];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) ((maxValue+1)* Math.random() - (maxValue+1)*Math.random());
        }
        return arr;
    }
    public static void printArray(int[] arr) {
        if (arr == null) {
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
    
    public static void main(String[] args) {        
        int maxSize=10;
        int maxValue=5;
        int[] arr = generateRandomArray(maxSize, maxValue);
        printArray(arr);
        
        int[] res = partition(arr, 0, arr.length-1, arr[arr.length-1]);
        printArray(arr);
        System.out.println(res[0]);
        System.out.println(res[1]);
        
    }


    
}

 

posted @ 2019-04-22 20:14  _luckyz  阅读(209)  评论(0编辑  收藏  举报