• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-80  評論-24  文章-0  trackbacks-0
            問題:一個大小為n的數組,里面的數有重復,要求找出數量超過一半的那個數。
            傳統方法就不說了,排序然后順序掃描查找,復雜度為O(nlogn + n) = O(nlogn),有些慢。
            《編程之美》上提供的方法是掃描數組,每次消去兩個不相同的數,這樣,到最后剩下的數必定是所求的數,證明非常簡單,略了。
            關鍵問題是編碼,如果寫不好容易些成O(n2)復雜度的,書上的寫法不錯:

             1 int find_messager(int *id, int n) {
             2   assert(id != NULL);
             3   int i;
             4   int times = 1;
             5   int messager = id[0];
             6   for (i = 1; i < n; ++i) {
             7     if (times == 0) {
             8       messager = id[i];
             9       times = 1;
            10     } else {
            11       if (messager == id[i]) {
            12         times++;
            13       } else {
            14         times--;
            15       }
            16     }
            17   }
            18   return messager;
            19 }

            擴展問題來了,如果有三個數,他們各自的總數都查過了n/4,那么怎么找出這三個數呢?
            其實和上面解法類似,只不過是用三個標記就可以了,代碼如下:

             1 struct Messager {
             2   int id[4];
             3 };
             4                                                                                                                   
             5 Messager *find_messagers(int *id, int n) {
             6   assert(id != NULL);
             7   Messager *msgr = new Messager;
             8   memset(msgr, 0, sizeof(Messager));
             9   int times[4] = {0, 0, 0, 0};
            10   int i, j;
            11   for (i = 0; i < n; ++i) {
            12     for (j = 1; j < 4; ++j) {
            13       if (times[j] > 0 && msgr->id[j] == id[i]) {
            14         times[j]++;
            15         break;
            16       }
            17     }
            18 
            19     if (j == 4) {
            20       for (j = 1; j < 4; ++j) {
            21         if (times[j] == 0) {
            22           times[j]++;
            23           msgr->id[j] = id[i];
            24           break;
            25         }
            26       }
            27       if (j == 4) {
            28         times[1]--;
            29         times[2]--;
            30         times[3]--;
            31       }
            32     }
            33   }
            34   return msgr;
            35 }

            這種思想非常清晰,并且實現非常巧妙!
            posted on 2012-09-04 15:06 myjfm 閱讀(627) 評論(0)  編輯 收藏 引用 所屬分類: 算法基礎
            97久久精品人人做人人爽| 手机看片久久高清国产日韩| 久久精品人妻中文系列| 伊人久久成人成综合网222| 久久久久久精品无码人妻| AV无码久久久久不卡网站下载| 精品久久久久久久| 思思久久99热只有频精品66 | 亚洲中文精品久久久久久不卡| 亚洲AV无码久久精品成人| 国产精品99久久精品| 国产精品99久久精品爆乳| 久久久久亚洲AV无码观看| 久久99国产精品二区不卡| 久久久久久国产a免费观看黄色大片| 69国产成人综合久久精品| 久久人搡人人玩人妻精品首页 | 中文字幕人妻色偷偷久久 | 精品久久人人妻人人做精品 | 久久综合香蕉国产蜜臀AV| 精品国产91久久久久久久a | 老男人久久青草av高清| 久久亚洲国产欧洲精品一| 久久精品国产色蜜蜜麻豆| 久久天天日天天操综合伊人av| 热re99久久精品国99热| 欧美精品福利视频一区二区三区久久久精品 | 国产亚洲美女精品久久久2020| 久久99久久无码毛片一区二区| 久久97精品久久久久久久不卡| 久久精品国产清高在天天线| 亚洲美日韩Av中文字幕无码久久久妻妇 | 中文精品久久久久人妻不卡| 欧美伊人久久大香线蕉综合69| 97久久精品人人澡人人爽| 久久久久久狠狠丁香| 久久被窝电影亚洲爽爽爽| 国产精品久久久久…| 久久久久夜夜夜精品国产| 日本三级久久网| 久久国产精品视频|