動機
資料本身也是有特性的
Problem
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
Example 2:
Input: nums = [3,4,-1,1]Output: 2
Example 3:
Input: nums = [7,8,9,11,12]Output: 1
Constraints:
1 <= nums.length <= 5 * 105
-231 <= nums[i] <= 231 - 1
Sol
從array中找出沒有的最小的正整數
同時要求時間是O(n),空間是常數
如果不管空間,就是用hash,走兩次就ok了
但現在不能用hash,又要類似排序的效果,這時就只能看有沒有辦法把每筆資料定位
注意到array的index一定是正整數,又可以一一對應,i對到i+1
所以接下來的任務就是讓每個i盡量是i+1。
那麼要從i+1到最後一個去找嗎? 這樣會變成O(n^2)!!
如果資料是在範圍內的,就一定只有那個位置可以擺,所以就是根據資料把資料換到正確的位置,反覆換下去,直到合法或是無法再換了
這個過程讓我想到,seasoned schemer的scramble,與little mler的exception的例子
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
if not nums:
return 1
for i in range(0,len(nums)):
while (nums[i] > 0 and nums[i] <= len(nums)) and nums[i] != nums[nums[i]-1]:
tmp = nums[nums[i]-1]
nums[nums[i]-1] = nums[i]
nums[i] = tmp
for i in range(0,len(nums)):
if i+1 != nums[i]:
return i+1
return len(nums)+1