每日一题系列 - 荷兰国旗问题

『每日一题』

题目取自清华大学《数据结构》题集,严蔚敏,米宁, 吴伟民

 

荷兰国旗问题:(难度5)设有一个仅由红白蓝三种颜色的条块组成的条块序列。求一种时间复杂度O(n)的算法,使得这些条块按红、白、蓝的顺序排好,即排成荷兰国旗的图案。

 

分析:大意是比如{红,蓝,白,白,蓝,红,白,蓝,白} -->{红,红,蓝,蓝,蓝,白,白,白,白}的调整

不过该题目并未规定是否可以另辟存储空间。

 

有兴趣的试试看吧。

 

『题解』:

其实此题并不难,如果一开始没有思路,可以先降级考虑一下两色旗问题,相信可以很快用分别指向队头和队尾两个的指针平行移动来调整序列内元素,算法复杂度是O(n)。然后考虑多了一种颜色,就是加了一个指针而已,算法复杂度不受影响。

 

该实现不用另辟array空间。需要额外几个指针。

 

//参数说明:red, current 指向队头,white指向队尾 void threeFlag(int* red, int * current, int * white) { while(current!=white) { if(*current==0){ if(current==red){current++;red++;continue;} if(current>red) { int temp; temp=*red; *red=*current; *current=temp; red++; continue; } } if(*current==1){current++;continue;} if(*current==2) { if(*white==2){white--;continue;} int temp; temp=*current; *current=*white; *white=temp; continue; } } } //testing scripts //0=red flag; 1=blue flag; 2=white int flags[12] ={0,1,2,1,0,2,1,2,1,1,1,0}; cout<

 

你可能感兴趣的:(我的代码)