美文网首页
荷兰国旗问题

荷兰国旗问题

作者: Ramsey16k | 来源:发表于2019-10-29 17:59 被阅读0次

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

解决思想(分治法):

  1. 我们想象在数组的两边各存在一个区域,一个是“小于”区,一个是“大于”区。“小于”区在数组的最左边,“大于”区在数组的最右边。
  2. 一开始这两个区域都不存在数,所以我们将小于区的下标设置为-1,大于区域的下标设置为数组的长度加1。
  3. 从下标0开始,比较数组里的数和num的大小。如果当前位置上的数小于num,就将其放在小于区域;如果等于num则不动,继续比较下一个数字;如果大于num,就将其放在大于区域。
  4. 在当前下标遇到大于区域时,整个流程结束。
    此时,小于区域在左边,等于区域在中间,大于区域在右边。

Java代码如下:

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) { //如果当前数小于num
                // 将当前数和“小于”区域的下一个数进行交换
                // 同时“小于”区域下标加1,当前下标加1,继续判断下一个数
                swap(arr, ++less, L++);
            } else if (arr[L] > num) { //如果当前数大于num
                // 将当前数和“大于”区域的前一个数x进行交换
                // 同时“大于”区域下标减1,当前下标不变,开始判断x和num的大小
                swap(arr, --more, L);
            } else { //当前等于num,当前下标加1,继续判断下一个数
                L++;
            }
        }
        return new int[] { less + 1, more - 1 }; // 返回“等于”区域的左边界、右边界的下标
    }

    // for test
    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

    // for test
    public static int[] generateArray() {
        int[] arr = new int[10];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * 3);
        }
        return arr;
    }

    // for test
    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[] test = generateArray();
        printArray(test);
        int[] res = partition(test, 0, test.length - 1, 1);
        printArray(test);
        System.out.println(res[0]);
        System.out.println(res[1]);
    }
}


相关文章

  • sort-colors

    荷兰国旗问题

  • 荷兰国旗问题

    给定一个数组,元素只有三种取值:0, 1, 2。分别代表三种颜色红白蓝。设计函数调整数组,使得数组按照0,1,2 ...

  • 荷兰国旗问题

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

  • 荷兰国旗问题

    1.荷兰国旗问题 传入num 数组中大于num的数放左边 小于num的数放右边 等于num的数 放中间 1....

  • 荷兰国旗问题

    荷兰国旗问题 1、问题 荷兰国旗是由红白蓝3种颜色的条纹拼接而成,如下图所示: 假设这样的条纹有多条,且各种颜色的...

  • 【算法】快速排序及优化

    一、荷兰国旗问题 在讲快速排序前,我们先来看看荷兰国旗问题。题目如下: 其实,这就是快排的partition过程,...

  • 【数组】--荷兰国旗问题

    问题:现有红,白,蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色球在一起。红白蓝...

  • 荷兰国旗问题(颜色排序问题)

    版权声明:本文为博主原创文章,转载请注明出处。个人博客地址:https://yangyuanlin.club欢迎来...

  • 算法—数组:荷兰国旗问题

    tips:本文章内容来自《程序员编程艺术:面试和算法心得》给定一个字符串里面只有"R" "G" "B" 三个字符,...

  • 9. 荷兰国旗问题

    题意:把n个红、白、蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两球的方式,使得从左到右小球的颜色依次...

网友评论

      本文标题:荷兰国旗问题

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