力扣 題目41 缺失的第乙個正數

2022-10-10 15:30:12 字數 1839 閱讀 3311

1.首先題目中提到我們只需要輸出 最小的正整數即可 那麼只看正數 0和負數都不看了

2.超過vector長度的數字也不用看 因為最好的結果 也就是1,2,3,4  5是解 也就是說最小的正整數的解 最大也就是vector的長度+1 而超過vector長度的自然也不用管

知道上面兩個前提之後再來看下面兩個方法

1.建立乙個和nums長度+1(下標對齊)的 vector 然後全部放入0這裡命名為ernums

2.遍歷nums 當nums[i] > 0&& nums[i]<= nums.size() 則將ernums對應的位置ernums[nums[i]] = 1; 改為1

3.從1開始遍歷ernums 第一次出現0的下標就是答案

4.如果都是1 說明答案是最大+1 直接返回ernums的長度即可

方法2--自身修改(方法來著官方題解)

方法1中我們用了ernums  當遍歷到對應的數時就修改ernums 那麼我們能不能直接對nums修改?

1.將負數和0改為nums.size()+1; 這樣就全是正數 方便下面步驟

2.遍歷一般nums 我們要將|nums[i]

|-1 位置改為負數 即 

int num = abs(nums[i]);

nums[num - 1] = -nums[num -1];

這樣代表的數字 對應位置就會變為負 和方法1的思路差不多

3.遍歷nums 答案是第乙個正數的位置加 1

4.如果陣列中的每乙個數都是負數,那麼答案是 nums.size() + 1

**1

1 #include2 #include3 #include4

using

namespace

std;

5class

solution 15}

16//

從一開始遍歷 第一次出現0的位置就是答案

17for (int i = 1; i < ernums.size(); i++) 21}

22//

如果都是1 說明答案是最大+1 直接返回ernums的長度即可

23return

ernums.size();24}

25};

2627

intmain() ;

30int num=sol.firstmissingpositive(nums);

31 cout << num <

32 }

view code

**2

1 #include2 #include3 #include4

using

namespace

std;

5class

solution 13}

14//

2.給陣列中的第 |x|-1 個位置的數新增乙個負號。

15for (int i = 0; i < nums.size(); i++) 21}

22}23//

3.在遍歷完成之後,如果陣列中的每乙個數都是負數,那麼答案是 n+1,否則答案是第乙個正數的位置加 1。

24for (int i = 0; i < nums.size(); i++) 28}

29return nums.size() + 1;30

}31};32

33int

main() ;

36int num=sol.firstmissingpositive(nums);

37 cout << num <

38 }

view code

力扣41 缺失的第乙個正數

題目描述 給你乙個未排序的整數陣列,請你找出其中沒有出現的最小的正整數。你的演算法的時間複雜度應為o n 並且只能使用常數級別的額外空間。思路 如果沒有時間複雜度和空間複雜度要求,直接排序或者雜湊表均可解決。常數級別的額外空間,則只能在輸入陣列原地交換。若是已排序的陣列,滿足x 對陣列每個元素進行遍...

力扣41 缺失的第乙個正數 題解

給你乙個未排序的整數陣列,請你找出其中沒有出現的最小的正整數。示例 1 輸入 1,2,0 輸出 3 示例 2 輸入 3,4,1,1 輸出 2 剛開始,覺得這道題可能要考察時間複雜度,因為正確率只有40 懷疑存在坑導致樣例通不過。寫完 沒想到一遍執行就過了。複雜度還不錯,o n 我使用雜湊表來儲存陣列...

力扣刷題 41 缺失的第乙個正數

思路 參考了大佬的方法三 將陣列視為雜湊表 整體的思路是每乙個正整數i對應的下標為i 1,通過for及while迴圈將每個正整數交換到正確的位置,然後從第0位開始迴圈查詢,如果出現數 位不匹配則輸出該下標本該對應的正數,即為缺失的第乙個正數。原地雜湊 雜湊函式為 f nums i nums i 1 ...