1. 程式人生 > >#leetcode刷題之路41-缺失的第一個正數

#leetcode刷題之路41-缺失的第一個正數

ostream == return pac ssi n) continue etc mes

給定一個未排序的整數數組,找出其中沒有出現的最小的正整數。
示例 1:
輸入: [1,2,0]
輸出: 3
示例 2:
輸入: [3,4,-1,1]
輸出: 2
示例 3:
輸入: [7,8,9,11,12]
輸出: 1

說明:
你的算法的時間復雜度應為O(n),並且只能使用常數級別的空間。

方法1:這個的話時空復雜度太大,不符合要求的

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int firstMissingPositive(vector<int
>& nums) { int ans=1; sort(nums.begin(),nums.end()); for(int i=0;i<nums.size();i++) { if(nums[i]<1) continue; if(nums[i]==ans) ans++; } return ans; } int main() { std::cout << "Hello, World!" << std::endl; return 0; }

方法1:改進的方式為,遍歷一次數組把大於等於1的和小於數組大小的值放到原數組對應位置,然後再遍歷一次數組查當前下標是否和值對應,如果不對應那這個下標就是答案,否則遍歷完都沒出現那麽答案就是數組長度加1。

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;

//int firstMissingPositive(vector<int>& nums) {
//    int ans=1;
// sort(nums.begin(),nums.end()); // for(int i=0;i<nums.size();i++) // { // if(nums[i]<1) continue; // if(nums[i]==ans) ans++; // } // return ans; //} int firstMissingPositive(vector<int>& nums) { for(int i = 0; i < nums.size();i++) { if (nums[i] >= 1 && nums[i] <= nums.size() && nums[nums[i] - 1] != nums[i]) { int temp = nums[i]; nums[i] = nums[temp - 1]; nums[temp - 1] = temp; if (i != nums.size() - 1) i--; } } for(int i = 0; i < nums.size(); i++) { if(nums[i] != i + 1) { return i + 1; } } return nums.size() + 1; } int main() { vector<int> nums={3,4,-1,1}; int ans=firstMissingPositive(nums); std::cout << ans << std::endl; return 0; }

#leetcode刷題之路41-缺失的第一個正數