美文网首页
荷兰国旗问题

荷兰国旗问题

作者: 王王王王王景 | 来源:发表于2019-08-03 10:26 被阅读0次

荷兰国旗问题

1、问题

荷兰国旗是由红白蓝3种颜色的条纹拼接而成,如下图所示:



假设这样的条纹有多条,且各种颜色的数量不一,并且随机组成了一个新的图形,新的图形可能如下图所示,但是绝非只有这一种情况:



需求是:把这些条纹按照颜色排好,红色的在上半部分,白色的在中间部分,蓝色的在下半部分,我们把这类问题称作荷兰国旗问题。
我们把荷兰国旗问题用数组的形式表达一下是这样的:

给定一个整数数组,给定一个值K,这个值在原数组中一定存在,要求把数组中小于K的元素放到数组的左边,大于K的元素放到数组的右边,等于K的元素放到数组的中间,最终返回一个整数数组,其中只有两个值,分别是等于K的数组部分的左右两个下标值。
例如,给定数组:[2, 3, 1, 9, 7, 6, 1, 4, 5],给定一个值4,那么经过处理原数组可能得一种情况是:[2, 3, 1, 1, 4, 9, 7, 6, 5],需要注意的是,小于4的部分不需要有序,大于4的部分也不需要有序,返回等于4部分的左右两个下标,即[4, 4]

2. 处理过程图示

我们以上面举的例子来看看处理过程的图示:


  • less 用于记录小于 4 的区域的右下标,初始为-1,代表不存在
  • more 用于记录大于 4 区域的左下标,初始为9,代表不存在
  • L 用于正在遍历的元素的下标,初始值为0
  • 从 arr[L] 即 arr[0] 开始遍历数组
    • 如果 arr[L] > 4, 交换 arr[++ less] 和 arr[L++] 的值
    • 如果 arr[L] < 4, 交换 arr[--more] 和 arr[L] 的值
    • 如果 arr[L] = 4, 不交换,L++,直接遍历下一个值
  • 当 L >= more,退出循环。


3、代码

class Solution {
public:
    vector<int> sortColors(vector<int>& nums, int target) {
        int small = -1, big = nums.size();
        int i = 0;
        while(i < big) { // 易错点
            if(nums[i] < target) {
                swap(nums, i++ , ++small);
            } else if(nums[i] > target) {
                swap(nums, i, --big);
            } else {
                ++i;
            }
        }
        // small + 1就是target的起始位置, big - 1就是target的结束位置
        vector<int> re({small + 1, big - 1});
        return re;
    }
    void swap(vector<int>& nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    } 
};

相关文章

  • 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/hpaddctx.html