41. First Missing Positive

問(wèn)題描述

Given an unsorted integer array, find the first missing positive integer.
For example,
Given [1,2,0] return 3,
and [3,4,-1,1] return 2.
Your algorithm should run in O(n) time and uses constant space.

問(wèn)題分析

這是一道hard題,自己沒(méi)有思路TAT椰弊,在網(wǎng)上搜了解答

分析題意

  • 要找的是第一個(gè)不存在的正數(shù)蝗锥,那么對(duì)于長(zhǎng)度為n的輸入捍歪,非正數(shù)和大于n的數(shù)都是沒(méi)有用的。
  • 要求用常數(shù)空間解決,因此不能另開(kāi)數(shù)組,而應(yīng)該在原數(shù)組上進(jìn)行操作,這時(shí)應(yīng)留意到本鸣,數(shù)組的下標(biāo)是0到n-1,與我們考慮的正數(shù)范圍1到n是一一對(duì)應(yīng)的硅蹦。
  • 我們利用下標(biāo)作為標(biāo)記荣德,將數(shù)組中每個(gè)在1到n之間的元素item,放在nums[item-1]的位置童芹,然后第二次遍歷數(shù)組涮瞻,找到第一個(gè)nums[i] != i+1的位置,則i+1就是我們要找的first missing postive integer假褪。

做法

  1. 第一次遍歷數(shù)組饲宛,若nums[i]的值在1,n之間且nums[nums[i]-1] != nums[i]嗜价,則交換nums[nums[i]-1]和nums[i]艇抠。nums[nums[i]-1] != nums[i]包含兩層含義,1)如果nums[i] != i+1久锥,則nums[i]-1 != i家淤,那么nums[i]需要被調(diào)換到它應(yīng)該去的位置;如果nums[nums[i]-1] == nums[i]說(shuō)明待交換的兩個(gè)數(shù)字相等瑟由,則不需交換絮重,否則會(huì)死循環(huán)。需要注意的是,如果被換到nums[i]位置的數(shù)字依然符合交換條件青伤,那么需要繼續(xù)進(jìn)行交換督怜,也就是說(shuō)這里不是一個(gè)if判斷,而是一個(gè)while循環(huán)狠角。
  2. 第二次遍歷數(shù)組号杠,找到第一個(gè)nums[i] != i+1的位置,返回i+1丰歌。

復(fù)雜度分析
雖然這個(gè)思想還是蠻好理解姨蟋,但是在一個(gè)for循環(huán)里又出現(xiàn)了一個(gè)while循環(huán),它的復(fù)雜度能是O(n)嗎立帖?其實(shí)是醬紫眼溶,算法復(fù)雜度應(yīng)該看的是基本操作的次數(shù),在這個(gè)問(wèn)題里晓勇,基本操作指的是交換操作堂飞,而每次交換操作,都至少有一個(gè)數(shù)字去了它應(yīng)該去的地方绑咱,那么一個(gè)n長(zhǎng)度的數(shù)組绰筛,最多只需要n次交換操作,所以它的復(fù)雜度是O(n)的~

AC代碼

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n = nums.size();
        int i;
        for (i = 0; i < n; i++){
            while(nums[i] > 0 && nums[i] < n && nums[nums[i]-1] != nums[i]){
                int tmp = nums[nums[i]-1];
                nums[nums[i]-1] = nums[i];
                nums[i] = tmp;
            }
        }
        for (i = 0; i < n; i++){
            if (nums[i] != i+1)
                break;
        }
        return i+1;
    }
};

Runtime: 3 ms, which beats 70.66% of cpp submissions.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末羡玛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宗苍,更是在濱河造成了極大的恐慌稼稿,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,207評(píng)論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讳窟,死亡現(xiàn)場(chǎng)離奇詭異让歼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)丽啡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén)谋右,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人补箍,你說(shuō)我怎么就攤上這事改执。” “怎么了坑雅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 170,031評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵辈挂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我裹粤,道長(zhǎng)终蒂,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,334評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮拇泣,結(jié)果婚禮上噪叙,老公的妹妹穿的比我還像新娘。我一直安慰自己霉翔,他們只是感情好睁蕾,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著早龟,像睡著了一般惫霸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上葱弟,一...
    開(kāi)封第一講書(shū)人閱讀 52,895評(píng)論 1 314
  • 那天壹店,我揣著相機(jī)與錄音,去河邊找鬼芝加。 笑死硅卢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的藏杖。 我是一名探鬼主播将塑,決...
    沈念sama閱讀 41,300評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蝌麸!你這毒婦竟也來(lái)了点寥?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,264評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤来吩,失蹤者是張志新(化名)和其女友劉穎敢辩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體弟疆,經(jīng)...
    沈念sama閱讀 46,784評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戚长,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怠苔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片同廉。...
    茶點(diǎn)故事閱讀 40,989評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柑司,靈堂內(nèi)的尸體忽然破棺而出迫肖,到底是詐尸還是另有隱情,我是刑警寧澤攒驰,帶...
    沈念sama閱讀 36,649評(píng)論 5 351
  • 正文 年R本政府宣布咒程,位于F島的核電站,受9級(jí)特大地震影響讼育,放射性物質(zhì)發(fā)生泄漏帐姻。R本人自食惡果不足惜稠集,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饥瓷。 院中可真熱鬧剥纷,春花似錦、人聲如沸呢铆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,814評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)棺克。三九已至悠垛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娜谊,已是汗流浹背确买。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,940評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纱皆,地道東北人湾趾。 一個(gè)月前我還...
    沈念sama閱讀 49,452評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像派草,于是被迫代替她去往敵國(guó)和親搀缠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評(píng)論 2 361

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