2019-01-14

經(jīng)典數(shù)據(jù)結(jié)構(gòu)題(一)

1、排序問(wèn)題
有一個(gè)整形數(shù)組A,請(qǐng)?jiān)O(shè)計(jì)一個(gè)時(shí)間復(fù)雜度為O(n)的算法肢簿,算出排序后相鄰兩數(shù)的最大差值。給定一個(gè)int數(shù)組A和A的大小n,請(qǐng)返回最大的差值池充。保證數(shù)組元素個(gè)數(shù)大于等于2小于等于500桩引。
測(cè)試樣例:
[9,3,1,10],4 返回:6
思路:先排序,再遍歷數(shù)組求出相鄰2個(gè)數(shù)的差收夸,保留最大值即可阐污,此時(shí)時(shí)間復(fù)雜度為O(nlogn)。由于非線性時(shí)間比較類(lèi)排序時(shí)間復(fù)雜度不能突破O(nlogn),因此使用桶排序的思想咱圆,對(duì)于n個(gè)數(shù),設(shè)置n+1個(gè)桶功氨,具體的序苏,先遍歷數(shù)組找出min和max,差值區(qū)間設(shè)置為d=(max-min)/n捷凄,于是區(qū)間是[minmin+d)忱详;[min+dmin+2d)……[min+(n-1)d~min+nd)這n區(qū)間,再單獨(dú)為最大值max設(shè)置一個(gè)桶跺涤,于是得到n+1個(gè)桶匈睁,已知數(shù)組元素總共有n個(gè),但是桶有n+1個(gè)桶错,并且元素min必定在第一個(gè)桶中航唆,max必定在n+1號(hào)桶中;顯然要把n個(gè)元素放入到n+1個(gè)桶中必定會(huì)產(chǎn)生空桶院刁,已知數(shù)組中的元素時(shí)整數(shù)糯钙,而雖然每個(gè)桶區(qū)間不一定是整數(shù),例如[23/7退腥,31/7)任岸,但是沒(méi)有關(guān)系,對(duì)于任意一個(gè)元素狡刘,它總會(huì)落入到某一個(gè)桶中享潜,并且可以知道,不同桶之間元素的差值必定大于d,同一個(gè)桶中的元素的差值必定小于d嗅蔬,于是可知要求元素之間的最大差值只需要在不同的桶之間尋找剑按,不用在同一個(gè)桶中尋找,并且題目要求是排序后相鄰2個(gè)元素的最大差值澜术,于是應(yīng)該尋找2個(gè)相鄰非空桶中前一個(gè)桶的最大值與后一個(gè)桶的最小值之間的差值吕座,遍歷所有桶,比較得到所有差值中的最大值就是結(jié)果所要求的相鄰2數(shù)最大差值瘪板。

注意理解:最終要對(duì)每2個(gè)非空的相鄰的桶求差值吴趴,而不能根據(jù)空桶的數(shù)目來(lái)確定2個(gè)相鄰?fù)暗牟钪担驗(yàn)橥暗拈L(zhǎng)度可能是小數(shù),那么間隔2個(gè)空桶和間隔3個(gè)空桶并不意味著后者具有更大的差值锣枝,因此應(yīng)該對(duì)所有相鄰的非空桶根據(jù)前桶的最大值和后桶的最小值求出差值作為比較對(duì)象厢拭,因此在遍歷時(shí)對(duì)于每一個(gè)桶,要求出這個(gè)桶中元素的最大值maxOfBucket[i]撇叁,最小值minOfBucket[i]供鸠,并且保留上一個(gè)非空桶的maxOfLastBucket,于是差值著2個(gè)相鄰非空桶的差值就是result= minOfBucket[i]- maxOfLastBucket陨闹;然后將當(dāng)前桶的maxOfBucket[i]最為下一個(gè)桶的maxOfLastBucket楞捂。逐步替換result,當(dāng)遍歷完成時(shí)就可以得到最大差值趋厉。

int getBucketID(int num ,int min, int max,int n){
      return (int) (num - min) *n /(max - min);
}
int maxGap(int A[],int n){
    int maxValue = A[0];
    int minValue = A[0];
    for (int i = 0; i < n; i++) {
        if (maxValue < A[i])maxValue = A[i];
        if (minValue > A[i])minValue = A[i];
    }
    int* mins = (int*)malloc(sizeof(int)*(n + 1));
    int* maxs = (int*)malloc(sizeof(int)*(n + 1));
    int* hasNum = (int*)malloc(sizeof(int)*(n + 1));
    for (int k =0 ; k < n + 1; k++) {
            hasNum[k] = 0;
    }
    int bucketID = 0;
    int i = 0;
    for (;i < n; i++) {
        bucketID = getBucketID(A[i],minValue, maxValue,n);
        if (hasNum[bucketID] == 1) {
            if (mins[bucketID] > A[i]) {
                mins[bucketID] = A[i];
            }
            if (maxs[bucketID] < A[i]) {
                maxs[bucketID] = A[i];
            }
        }else{
            mins[bucketID] = A[i];
            maxs[bucketID] = A[i];
        }
         hasNum[bucketID] = 1;
    }
    int maxGap = 0;
    int lastMax = 0;
    i = 0;
    while (i < n + 1) {
         //找到一個(gè)空桶,記錄下前一個(gè)桶的最大值
        while (i < n + 1 && hasNum[i] == 1) {
            i++;
        }
        if (i == n + 1)break;
        lastMax = maxs [i-1];
        while (i < n + 1 && hasNum[i] == 0) {
            i++;
        }
        if (i == n + 1)break;
        if (maxGap <= mins[i] - lastMax) {
            maxGap = mins[i] - lastMax;
        }
    }
   free(mins);
   free(maxs);
   free(hasNum);
    return maxGap;
}

2寨闹、最大差值
有一個(gè)長(zhǎng)為n的數(shù)組A,求滿足0≤a≤b<n的A[b]-A[a]的最大值君账。 給定數(shù)組A及它的大小n繁堡,請(qǐng)返回最大差值。
測(cè)試樣例: [10,5],2 返回:0
思路: 從后向前和前邊的最小數(shù)的差值乡数,記錄下來(lái)椭蹄。最后遍歷記錄的數(shù)值找最大的。

int maxDivision(int A[],int n){
   int maxValue = 0;
   int minValue = A[0];
   int temp;
   for (int i = 1;i < n;i++) {
       if ((temp = A[i] - minValue) > maxValue) {
           maxValue = temp;
       }
       if (minValue > A[i]) {
           minValue = A[i];
       }
   }
   return maxValue;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末净赴,一起剝皮案震驚了整個(gè)濱河市绳矩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玖翅,老刑警劉巖埋酬,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異烧栋,居然都是意外死亡写妥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)审姓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)珍特,“玉大人,你說(shuō)我怎么就攤上這事魔吐≡玻” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵酬姆,是天一觀的道長(zhǎng)嗜桌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)辞色,這世上最難降的妖魔是什么骨宠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上层亿,老公的妹妹穿的比我還像新娘桦卒。我一直安慰自己,他們只是感情好匿又,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布方灾。 她就那樣靜靜地躺著,像睡著了一般碌更。 火紅的嫁衣襯著肌膚如雪裕偿。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天痛单,我揣著相機(jī)與錄音嘿棘,去河邊找鬼。 笑死桦他,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谆棱。 我是一名探鬼主播快压,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼垃瞧!你這毒婦竟也來(lái)了蔫劣?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤个从,失蹤者是張志新(化名)和其女友劉穎脉幢,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嗦锐,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫌松,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奕污。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萎羔。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖碳默,靈堂內(nèi)的尸體忽然破棺而出贾陷,到底是詐尸還是另有隱情,我是刑警寧澤嘱根,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布髓废,位于F島的核電站,受9級(jí)特大地震影響该抒,放射性物質(zhì)發(fā)生泄漏慌洪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒋譬。 院中可真熱鬧割岛,春花似錦、人聲如沸犯助。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剂买。三九已至惠爽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞬哼,已是汗流浹背婚肆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坐慰,地道東北人较性。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像结胀,于是被迫代替她去往敵國(guó)和親赞咙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 該文章總結(jié)自牛課網(wǎng)的在線算法課程(https://www.nowcoder.com/) 經(jīng)典排序算法就是前面講那幾...
    鍋與盆閱讀 7,711評(píng)論 6 14
  • 1. 找出數(shù)組中重復(fù)的數(shù)字 題目:在一個(gè)長(zhǎng)度為n的數(shù)組里的所有數(shù)字都在0到n-1的范圍內(nèi)糟港。數(shù)組中某些數(shù)字是重復(fù)的攀操,...
    BookThief閱讀 1,766評(píng)論 0 2
  • 七、物質(zhì)宇宙的大小及年齡 1秸抚、從物質(zhì)粒子的大小看微觀宇宙有多小 ⑴物質(zhì)由分子組成 在宇宙中的一切物質(zhì)均由分子組成速和。...
    宇宙形成閱讀 886評(píng)論 0 0
  • 我一直都否定自己的能力吭敢,一直覺(jué)得自己不行慈迈。很多事情在沒(méi)有做之前,我在潛意識(shí)已經(jīng)否定了自己省有,認(rèn)為自己不行痒留。 322+...
    渺曉小小閱讀 1,081評(píng)論 0 0
  • 2018年3月21日 星期三 陰,低溫 今天的氣溫著實(shí)低蠢沿! 早上醒來(lái)第一件事伸头,是偷偷在娃家長(zhǎng)群里問(wèn)問(wèn)老師,今天學(xué)...
    木徒閱讀 264評(píng)論 0 0