leetcode41 --- firstMissingPositive
1 題目
給你一個(gè)未排序的整數(shù)數(shù)組?nums?,請(qǐng)你找出其中沒(méi)有出現(xiàn)的最小的正整數(shù)。
請(qǐng)你實(shí)現(xiàn)時(shí)間復(fù)雜度為?O(n)?并且只使用常數(shù)級(jí)別額外空間的解決方案。
2 解法
最笨的方法是從1開(kāi)始試, 看1在數(shù)組里面是否出現(xiàn)過(guò), 2, 3, ....不過(guò)時(shí)間復(fù)雜度是.
2.1 hash
可以考慮用hash, 遍歷數(shù)組, 把每個(gè)元素的值作為key, 遍歷完數(shù)組之后再?gòu)?開(kāi)始看是否在hash里面. 但是這樣做會(huì)額外申請(qǐng)一個(gè)hash容器, 這樣就不是常數(shù)級(jí)額外空間了, 而是. 于是考慮利用原數(shù)組構(gòu)造所需hash表. 首先要明確一點(diǎn), 假設(shè)數(shù)組的元素個(gè)數(shù)是n, 會(huì)有兩種情況, 如果數(shù)組正好囊括了所有1 ~ n的所有正整數(shù), 那么不存在的最小正整數(shù)就是n + 1, 但凡有一個(gè)元素值不在1 ~ n中, 所求結(jié)果就在[1, n]中. 可以考慮遍歷數(shù)組, 如果元素值value在[1, n]中, 那么就在對(duì)應(yīng)nums[value - 1](n個(gè)元素下標(biāo)從0開(kāi)始, nums[0]代表第一個(gè)元素)標(biāo)記一下, 證明value是出現(xiàn)過(guò)的, 這樣最后再遍歷nums, 發(fā)現(xiàn)第一個(gè)沒(méi)有標(biāo)記上的元素的索引 + 1就是所找的最小正整數(shù). 但是怎么標(biāo)記呢? 比如元素value在[1, n] 中, 那么就要對(duì)nums[value - 1]進(jìn)行標(biāo)記, 但是還不能丟失該元素的值信息(比如nums[value - 1]也在[1, n]里面, 你改成n + 2的話就會(huì)丟失原有的信息了), 所以考慮到設(shè)置成負(fù)值. 這樣結(jié)尾遍歷的時(shí)候, 小于零的話證明這個(gè)位置被別人標(biāo)記過(guò), 也就是占位的正整數(shù)出現(xiàn)過(guò), 那么大于0的值的下標(biāo) + 1就是第一個(gè)結(jié)果. 如果遍歷到最后還沒(méi)有返回值, 那么就是n + 1, 要這么做的話首先要保證所有元素都為正的, 那么就把非正元素設(shè)置為n + 1.
代碼:
int firstMissingPositive(vector<int>& nums) {int nums_size = nums.size();for (int &num: nums) {if (num <= 0) {num = nums_size + 1;}}for (int i = 0; i < nums_size; i ++) {if (nums[i] <= 0) {nums[i] = nums_size + 1;}}for (int i = 0; i < nums_size; i ++) {int ele_abs = abs(nums[i]);if (ele_abs <= nums_size) {nums[ele_abs - 1] = -abs(nums[ele_abs - 1]);}}for (int i = 0; i < nums_size; i ++) {if (nums[i] > 0)return i + 1;}return nums_size + 1; }2.2 置換法
總結(jié)
以上是生活随笔為你收集整理的leetcode41 --- firstMissingPositive的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c语言实现顺序表源程序,C语言实现静态顺
- 下一篇: c语言~991|4等于多少,复习C语言9