【左神算法】荷兰国旗问题

1.问题

荷兰国旗问题
给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间, 大于num的数放在数组的右边。

2.code

思路:

荷兰国旗问题的解决
     *  1.设定less 为-1 位置 more 为arr.length位置 cur为当前移动的 在0位置
     *  a.终止条件 cur < more 一直执行
     *  b. 1.如果 arr[cur] < p 将less+1的位置和当前cur指向的元素置换 less区逼迫等于区向右移动
     *     2.如果 arr[cur] > p 将more-1的位置和当前cur指向的元素置换 more区域逼迫等于区向左移动 因为刚置换为最后more-1的元素
     *       所以 cur不需要移动 需要再一次判断。
     *     3.就是arr[cur] == p cur 直接跳过cur++;
     *  以上就是解决荷兰问题的基本思路、问题的解决有点类似于双指针,不过这里是三指针(自己的想法) 左 中 右 符合哪个指针 就进行什么样的操作、
package com.ncst.base.one;

import java.util.Arrays;

/**
 * @author i
 * @create 2020/5/8 12:42
 * @Description 荷兰国旗问题
 *      给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,
 *      大于num的数放在数组的右边。
 */
public class NetherlandsFlag {

    /***
     *  荷兰国旗问题的解决
     *  1.设定less 为-1 位置 more 为arr.length位置 cur为当前移动的 在0位置
     *  a.终止条件 cur < more 一直执行
     *  b. 1.如果 arr[cur] < p 将less+1的位置和当前cur指向的元素置换 less区逼迫等于区向右移动
     *     2.如果 arr[cur] > p 将more-1的位置和当前cur指向的元素置换 more区域逼迫等于区向左移动 因为刚置换为最后more-1的元素
     *       所以 cur不需要移动 需要再一次判断。
     *     3.就是arr[cur] == p cur 直接跳过cur++;
     *  以上就是解决荷兰问题的基本思路、问题的解决有点类似于双指针,不过这里是三指针(自己的想法) 左 中 右 符合哪个指针 就进行什么样的操作、
     * @param arr 数组
     * @param p  选取的target目标值
     * @return
     */
    public static int[] partiation(int[] arr, int p) {
        int less = -1, more = arr.length, cur = 0;
        while (cur < more) {
            if (arr[cur] < p) {
                swap(arr, ++less, cur++);
            } else if (arr[cur] > p) {
                swap(arr, --more, cur);
            } else {
                cur++;
            }
        }
        return arr;
    }

    private static void swap(int[] arr, int x, int y) {
        int temp = arr[x];
        arr[x] = arr[y];
        arr[y] = temp;
    }

    public static void main(String[] args) {
        int[] arr = {1, 4, 5, 3, 2, 9};
        System.out.println(Arrays.toString(partiation(arr, 4)));
    }


}

posted @ 2020-05-08 13:08  qxlxi  阅读(311)  评论(0编辑  收藏  举报