美文网首页
荷兰国旗问题

荷兰国旗问题

作者: 今天不想掉头发 | 来源:发表于2019-08-19 19:24 被阅读0次

    荷兰国旗问题:给定一个数num,将数组中划分成3部分,小于num的部分,等于num的部分,大于num的部分

    例题:一个数组只有0,1,2三个数,问遍历一遍怎么完成排序,要求空间复杂度为O(1)

    /**
         * 将数组分成三个区域,0,1,2,从头开始遍历
         * 如果当前数字是2,则和最后面hi交换;
         * 如果当前数字是0,则和前面的lo交换;
         * 如果当前数字是1,则直接++即可
         * @param nums
         */
        public static void sort(int[] nums) {
            int n = nums.length;
            int lo = -1, cur = 0, hi = n - 1;
            while (cur < hi) {
                if (nums[cur] == 2) {
                    swap(nums, cur, hi--);
                } else if (nums[cur] == 1) {
                    cur++;
                } else {
                    swap(nums, cur++, ++lo);
                }
            }
        }
    
        public static void swap(int[] nums, int m, int n) {
            int tmp = nums[m];
            nums[m] = nums[n];
            nums[n] = tmp;
        }
        public static void main(String[] args) {
            int[] nums = {2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 0, 0, 2};
            sort(nums);
            System.out.println(Arrays.toString(nums));
        }
    

    相关文章

      网友评论

          本文标题:荷兰国旗问题

          本文链接:https://www.haomeiwen.com/subject/djdesctx.html