zoukankan      html  css  js  c++  java
  • LeetCode Sort Colors (技巧)

     题意:

      一个数组只可能含有3种数据,分别为1,2,3,请将数组排序(只能扫一遍)。

    思路:

      如果扫两遍的话,用个桶记录一下,再赋值上去就行了。

     1 class Solution {
     2 public:
     3     void sortColors(vector<int>& nums) {
     4         int cnt[3]={0};
     5         for(int i=0; i<nums.size(); i++)
     6             cnt[nums[i]]++;
     7         for(int j=0,i=0; j<3; j++)
     8             while(cnt[j]-- > 0)
     9                 nums[i++]=j;
    10     }
    11 };
    AC代码

      还有这种傻瓜方法,扫一遍先将2移到末尾,再扫一遍将0移到前面。仍然无效率。

     1 class Solution {
     2 public:
     3     void sortColors(vector<int>& nums) {
     4         int L=0, R=nums.size()-1;
     5         for(int i=0; i<nums.size(); i++)
     6         {
     7             while(L<R && nums[L]!=2)    L++;
     8             while(L<R && nums[R]==2)    R--;
     9             if(L<R)    swap(nums[L],nums[R]);
    10         }
    11         L=0, R=nums.size()-1;
    12         for(int i=0; i<nums.size(); i++)
    13         {
    14             while(L<R && nums[L]!=1)    L++;
    15             while(L<R && nums[R]!=0)    R--;
    16             if(L<R)    swap(nums[L],nums[R]);
    17         }
    18     }
    19 };
    AC代码

      还有一种吊吊的,扫一遍就搞定的。扫一遍数组,考虑nums[i],如果nums[i]=2,立刻换到末尾,此时nums[i]有可能仍然是2,如果是2,一直继续换到末尾。这样就保证了区间(L,i)中不可能出现2,如果此时nums[i]为0,就与前面的换,此时nums[i]就只可能是0或1了,0就一直换,1就pass。

     1 class Solution {
     2 public:
     3     void sortColors(vector<int>& nums) {
     4          int L=-1, R=nums.size();
     5         for(int i=0; i<R; i++)
     6         {
     7             while(i<R&&nums[i]==2)    
     8                 swap(nums[i],nums[--R]);    
     9             if(nums[i]==0)    
    10                 swap(nums[i],nums[++L]);
    11         }
    12     }
    13 };
    AC代码

      

  • 相关阅读:
    IOC和DI的区别
    hdu 1217(Floyed)
    hdu 2112(字典树+最短路)
    hdu 4081(次小生成树)
    hdu 1811(缩点+拓扑排序+并查集)
    poj 3026(BFS+最小生成树)
    hdu 3635(并查集)
    hdu 3047(扩展并查集)
    hdu 1116(并查集+欧拉路径)
    poj 1679(次小生成树)
  • 原文地址:https://www.cnblogs.com/xcw0754/p/4931205.html
Copyright © 2011-2022 走看看