sort color (荷兰国旗)

算法思想:

该问题是一个排序问题,可以将这个数组分为前部、中部、后部。这里的思路如下:将前部和后部的排在数组的前边和后边,中部的就自然排好了。设置三个指针:begin,mid,end,然后从mid的位置开始遍历。

1.如果遍历到的位置为0,则说明它属于前部,就将mid和begin交换,然后mid和begin前进。

2.如果遍历到的位置是1,则说明它属于中部,则只将mid前进。

3.如果遍历到的位置是2,则说明它属于后部,将mid和end交换,由于交换后mid的指向不确定,因此只将end--。

void sortColors(vector<int>& nums) {
        int begin=0,end=nums.size()-1,mid=0;
        while(mid<=end&&begin<=mid){
            if(nums[mid]==0){
                swap(nums[mid],nums[begin]);
                begin++;
                mid++;
            }
            else if(nums[mid]==1)
                mid++;
            else if(nums[mid]==2){
                swap(nums[mid],nums[end]);
                end--;
            }
        }
}
时间: 2024-11-09 05:47:17

sort color (荷兰国旗)的相关文章

75. Sort Colors(荷兰国旗问题 三指针)

Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integers 0, 1, and 2 to represent the color red, white, and bl

快速排序深入之荷兰国旗问题

一.序言 在使用partition-exchange排序算法时,如快速排序算法(即使选择了一个好的关键元素pivot values),我们往往面临一个很尴尬的境地--当排序对象中有很多重复的元素,partition-exchange排序算法表现很不尽如人意.当所有元素都相等时,这就特别容易理解了.在每次递归中,左边部分是空的(没有元素比关键元素小),而右边部分只能一个一个递减移动.结果导致耗费了二次方时间来排序相等元素.为了解决这个问题(有时叫做荷兰国旗问题),我们详细介绍下解决这个问题的方法.

[算法系列之十一]荷兰国旗问题

[问题] 现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起.这个问题之所以叫荷兰国旗问题,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗. [分析] 这个问题我们可以将这个问题视为一个数组排序问题.红白蓝分别对应数字0.1.2.红.白.蓝三色小球数量并不一定相同. [思路一] First, iterate the array counting number of 0's, 1's, and 2's, then overwr

荷兰国旗问题

荷兰国旗问题: 现有红,白,蓝三个不同颜色的小球,乱序排列在一起,重新排列这些小球,使得红白蓝三色的同颜色的球在一起. 问题分析: 问题转换为:给定数组A[0,1,...,N-1],元素只能取0,1,2三个值,设计算法使得数组重新排列成“000...111..222”的形式. 可以使用三个游标,begin=0,cur=0,end=N-1. 程序实现: 1 /*************************************** 2 FileName HollandFlag.cpp 3 A

荷兰国旗问题 划分成3部分 leecode

1 public class Solution { 2 public void sortColors(int[] A) { 3 int len=A.length; 4 int beg=0; 5 int end=len-1; 6 int cur=0; 7 while(cur<=end){ 8 if(A[cur]==0) 9 { 10 swap(A,cur,beg); 11 beg++; 12 cur++; 13 14 15 } 16 else if(A[cur]==1) 17 { 18 cur++

NYOJ_268_荷兰国旗问题

荷兰国旗问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描写叙述 荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红.白.蓝.现有若干由红.白.蓝三种颜色的条块序列.要将它们又一次排列使全部同样颜色的条块在一起.本问题要求将全部红色的条块放最左边.全部白色的条块放中间.全部蓝色的条块放最右边. 输入 第1行是一个正整数n(n<100),表示有n组測试数据.接下来有n行,每行有若干个由R,W,B三种字符构成的字符串序列,当中R,W和B分别表示红.白.蓝三种颜色的条块

荷兰国旗问题:

何谓荷兰国旗: 现有红.白.蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起.这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗. 问题转换为:给定数组A[0…N-1],元素只能取0.1.2三个值,设计算法,使得数组排列成“00…0011…1122…22”的形式. 借鉴快速排序中partition的过程.定义三个指针:begin=0.current=0.end=N-1: A[cur]==2,则A[cur] 与

荷兰国旗 Flag of the Kingdom of the Netherlands

问题描述:现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫做荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列后正好组成荷兰国旗. 解题方法1:蛮力求解 解题方法2:为了讨论方便用数字0表示红色球,用数字1表示白色球,用数字2表示蓝色球,所以最后的排序就是0...1...2... 快速排序基于划分过程,选取主元间整个数组划分为两个子数组.是否可以借鉴划分过程设定三个指针完成一次遍历完成重新排列,使得所有的球

荷兰国旗

题目描述 拿破仑席卷欧洲大陆之后,代表自由,平等,博爱的竖色三色旗也风靡一时.荷兰国旗就是一面三色旗(只不过是横向的),自上而下为红白蓝三色. 该问题本身是关于三色球排序和分类的,由荷兰科学家Dijkstra提出.由于问题中的三色小球有序排列后正好分为三类,Dijkstra就想象成他母国的国旗,于是问题也就被命名为荷兰旗问题(Dutch National Flag Problem). 下面是问题的正规描述: 现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右

编程之法:面试和算法心得(荷兰国旗)

内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 拿破仑席卷欧洲大陆之后,代表自由,平等,博爱的竖色三色旗也风靡一时.荷兰国旗就是一面三色旗(只不过是横向的),自上而下为红白蓝三色. 该问题本身是关于三色球排序和分类的,由荷兰科学家Dijkstra提出.由于问题中的三色小球有序排列后正好分为三类,Dijkstra就想象成他母国的国旗,于是问题也就被命名为荷兰旗问题(Dutch National Flag Problem). 下面是问题的正规描述: 现有n个红白蓝