[LeetCode] 41. First Missing Positive
阿新 • • 發佈:2021-10-21
[LeetCode] 41. First Missing Positive
題目
Given an unsorted integer array nums, return the smallest missing positive integer.
You must implement an algorithm that runs in O(n) time and uses constant extra space.
Example 1:
Input: nums = [1,2,0]
Output: 3
思路
方法一:雜湊
總共有 n 個數,所以第一個缺失的正整數一定在[1, n] 之間,所以只用考慮在 [1, n] 的數,用一個數組 a , a[i] = true, 表示 i 這個正整數沒有缺失。找第一個使 a[i] = false 的就是答案。
其實可以不用 a 這個陣列, 可以用原陣列數的正負來表示 false 和 true, 因為非正數對結果沒有影響,可以先把原陣列所有的非正數(包括0)變為 n+1, 這樣陣列就變為非負的,如果一個 [1, n] 中的數 x 存在,那麼就把 a[x] 變為負的,最後找第一個為正數的位置就是答案。
方法二:
將元素置換到原來的位置上。([1 2 3 ... N])
程式碼
歡迎轉載,轉載請註明出處!class Solution { public: int firstMissingPositive(vector<int>& nums) { int n = nums.size(); for (int& num: nums) { if (num <= 0) { num = n + 1; } } for (int i = 0; i < n; i++) { int num = abs(nums[i]); if (num <= n) { nums[num-1] = -abs(nums[num-1]); } } for (int i = 0; i < n; i++) { if (nums[i] > 0) { return i + 1; } } return n + 1; } };