上海個(gè)人醫(yī)療網(wǎng)站備案表自媒體是如何賺錢(qián)的
題目:
解題一:
如果不考慮時(shí)間復(fù)雜度和空間復(fù)雜度的話(huà),我們最先想到的辦法是先將該數(shù)組進(jìn)行排序和去重,將最初的res結(jié)果值設(shè)置為1;將然后進(jìn)行遍歷,如果第一項(xiàng)不為1,則返回1,否則根據(jù)遍歷res++;遍歷結(jié)束后發(fā)現(xiàn)每一項(xiàng)都符合要求則返回res的最終值。代碼如下:
代碼一:
/*** @param {number[]} nums* @return {number}*/
var firstMissingPositive = function(nums) {nums = Array.from(new Set(nums));nums.sort((a,b)=>a-b);let res = 1;for(let i = 0; i < nums.length;i++){if(nums[i] > 0){if(nums[i] != res){return res;}res++;}}return res;
};
?sort函數(shù)的時(shí)間復(fù)雜度為O(n log n),空間復(fù)雜度為O(n)
?new Set操作的時(shí)間復(fù)雜度是O(n),空間復(fù)雜度也是O(n)?
以上代碼并沒(méi)有滿(mǎn)足題目要求的時(shí)間復(fù)雜度為 O(n) 并且只使用常數(shù)級(jí)別額外空間的解決方案。
解題二:
我們這次使用了一個(gè)Set(numSet)來(lái)存儲(chǔ)數(shù)組中出現(xiàn)過(guò)的正數(shù)。首先,我們遍歷原數(shù)組nums,將每個(gè)在1到n范圍內(nèi)的正數(shù)添加到Set中。然后,我們?cè)俅伪闅v從1到n的每個(gè)數(shù)字,檢查它是否在Set中出現(xiàn)過(guò)。如果找到一個(gè)沒(méi)有出現(xiàn)過(guò)的數(shù)字,我們就返回它作為缺失的第一個(gè)正整數(shù)。如果所有1到n的數(shù)字都出現(xiàn)過(guò),我們則返回n+1。
代碼二:
/*** @param {number[]} nums* @return {number}*/
var firstMissingPositive = function(nums) {let numSet = new Set();let n = nums.length;for(let i = 0; i < n;i++){if(nums[i] > 0 && nums[i] <= n){numSet.add(nums[i]);}}for(let i = 1; i <= n;i++){if(!numSet.has(i)){return i;}}return n + 1;
};
但是我們使用了一個(gè)額外的Set來(lái)存儲(chǔ)出現(xiàn)過(guò)的數(shù)字,所以這里的空間復(fù)雜度為O(n);時(shí)間復(fù)雜度是O(n),因?yàn)槲覀冎槐闅v了數(shù)組兩次,并且Set的查找和插入操作都是O(1)的。
解題三:
將所有負(fù)數(shù)、0 都變?yōu)?N + 1,我們只需要考慮1-n的數(shù)字
遍歷每個(gè)數(shù),如果該數(shù) |x| 屬于[1,N];把在 x-1 的位置的數(shù)加上一個(gè)負(fù)號(hào)
遍歷完之后,如果全部數(shù)都是負(fù)數(shù)——答案就是 1+N,否則就是第一個(gè)正數(shù)的位置+1
代碼三:
/*** @param {number[]} nums* @return {number}*/
var firstMissingPositive = function(nums) {let n = nums.length;for(let i = 0; i < n;i++){if(nums[i] <= 0) nums[i] = n + 1;}for(let i = 0; i < n;i++){let x = Math.abs(nums[i]);if(x >= 1 && x <= n){nums[x - 1] = nums[x - 1] < 0 ? nums[x - 1] : -nums[x - 1];}}for(let i = 0; i < n;i++){if(nums[i] >= 0) return i+1;}return n + 1;
};
此時(shí)就滿(mǎn)足時(shí)間復(fù)雜度為o(n),空間復(fù)雜度為常數(shù)的代碼了。此思路借鑒于力扣博主okkjoo,具體地址點(diǎn)擊此處跳轉(zhuǎn)。
當(dāng)博主問(wèn)朋友解決方案的時(shí)候,他二話(huà)不說(shuō)的告訴我“用桶排啊!!”,于是,、、、、這篇文章到這里沒(méi)有結(jié)束,,明天博主會(huì)盡快將桶排的方法補(bǔ)充上去,也歡迎小伙伴們?cè)谠u(píng)論區(qū)留下你們的答案哦~~~~~