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


    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)));
        }
    
    
    }
    
    
  • 相关阅读:
    今天实现了 沿路径移动
    enum类型的本质(转)
    (转)成为优秀技术人员的两点建议
    深入理解 C# 协变和逆变
    web通信
    ajax入门(复习)
    git版本管理工具的使用
    在asp.net 中使用httpmodules对网页进行处理
    asp.net http概念原理复习
    web page复习笔记
  • 原文地址:https://www.cnblogs.com/qxlxi/p/12860586.html
Copyright © 2020-2023  润新知