【NC30】缺失的第一个正整数
生活随笔
收集整理的這篇文章主要介紹了
【NC30】缺失的第一个正整数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
描述
給定一個無重復元素的整數數組nums,請你找出其中沒有出現的最小的正整數
進階: 空間復雜度 O(1),時間復雜度 O(n)
數據范圍:
-2^31<=nums[i]<=2^31-1
0<=len(nums)<=5*10^5
示例1
輸入:
[1,0,2]復制返回值:
3復制
示例2
輸入:
[-2,3,4,1,5]復制返回值:
2復制
示例3
輸入:
[4,5,6,8,9]復制返回值:
1解題報告:
注意這題的關鍵信息,每個數字都各不相同,且len(nums)<=5*10^5
要求空間復雜度O(1)所以可以考慮復用原數組的空間。
首先從答案出發,考慮答案的可能范圍,發現一定在[1,n+1],把不合法的值都歸一化成-1。
然后因為各不相同,所以我們可以把每個不在對應位置上的都給他變到對應位置上。這個對應位置,可以約定為,x在nums[x-1]上,這樣就可以保證[1,n]會在[0,n-1]位置上。
然后從小到大遍歷,如果nums[i] != i+1,則 i 就是答案。
AC代碼:
class Solution { public:/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** * @param nums int整型vector * @return int整型*/int minNumberDisappeared(vector<int>& nums) {// write code herefor(int i = 0; i<nums.size(); i++) {if(nums[i] <= 0 || nums[i] > int(nums.size())) nums[i] = -1;}for(int i = 0; i<nums.size(); i++) {if(nums[i] == -1) continue;int p = nums[i];while(p>0 && nums[p-1] != p) {int cur_num = nums[p-1];nums[p-1] = p;p = cur_num;}}for(int i = 0; i<nums.size(); i++) {if(nums[i] != i+1) return i+1;}return nums.size()+1;} }; /* 從結果入手考慮,結果肯定在(1,len)之間*/總結
以上是生活随笔為你收集整理的【NC30】缺失的第一个正整数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡审核未通过是什么原因 信用卡被拒原
- 下一篇: 如何避免投资风险过高的基金?把握这五点