• <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  評(píng)論-24  文章-0  trackbacks-0
            問(wèn)題:一個(gè)大小為n的數(shù)組,里面的數(shù)有重復(fù),要求找出數(shù)量超過(guò)一半的那個(gè)數(shù)。
            傳統(tǒng)方法就不說(shuō)了,排序然后順序掃描查找,復(fù)雜度為O(nlogn + n) = O(nlogn),有些慢。
            《編程之美》上提供的方法是掃描數(shù)組,每次消去兩個(gè)不相同的數(shù),這樣,到最后剩下的數(shù)必定是所求的數(shù),證明非常簡(jiǎn)單,略了。
            關(guān)鍵問(wèn)題是編碼,如果寫不好容易些成O(n2)復(fù)雜度的,書上的寫法不錯(cuò):

             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 }

            擴(kuò)展問(wèn)題來(lái)了,如果有三個(gè)數(shù),他們各自的總數(shù)都查過(guò)了n/4,那么怎么找出這三個(gè)數(shù)呢?
            其實(shí)和上面解法類似,只不過(guò)是用三個(gè)標(biāo)記就可以了,代碼如下:

             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 }

            這種思想非常清晰,并且實(shí)現(xiàn)非常巧妙!
            posted on 2012-09-04 15:06 myjfm 閱讀(628) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 算法基礎(chǔ)
            久久久久久久免费视频| 中文字幕久久欲求不满| 久久久久国色AV免费观看| 国产精自产拍久久久久久蜜| 久久久久久久国产免费看| 少妇无套内谢久久久久| 日韩精品久久久久久久电影| 伊人久久大香线蕉亚洲| 国产AⅤ精品一区二区三区久久| 少妇熟女久久综合网色欲| 亚洲AV无码久久精品成人| 狠狠色丁香婷婷久久综合不卡| 香蕉久久永久视频| 久久福利青草精品资源站免费| 免费精品久久久久久中文字幕| 久久天天躁狠狠躁夜夜avapp| 久久AAAA片一区二区| 久久精品国产亚洲沈樵| 久久AV无码精品人妻糸列| 99久久国产免费福利| 亚洲av伊人久久综合密臀性色| 久久久久99精品成人片三人毛片| 精品免费久久久久久久| 热久久视久久精品18| 久久天天日天天操综合伊人av| …久久精品99久久香蕉国产| 狠狠色婷婷久久一区二区| 色婷婷综合久久久久中文字幕| 久久久精品人妻一区二区三区蜜桃| 久久99久久成人免费播放| 66精品综合久久久久久久| 要久久爱在线免费观看| 久久久久久国产精品无码超碰| 久久亚洲精品成人av无码网站| 新狼窝色AV性久久久久久| 国产成人AV综合久久| 亚洲伊人久久大香线蕉苏妲己 | 亚洲AV无码久久精品狠狠爱浪潮| 久久精品aⅴ无码中文字字幕重口| 久久亚洲精品国产亚洲老地址| 狠狠色综合久久久久尤物|