[Swift]LeetCode41. 缺失的第一个正数 | First Missing Positive
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9901428.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Given an unsorted integer array, find the smallest missing positive integer.
Example 1:
Input: [1,2,0] Output: 3
Example 2:
Input: [3,4,-1,1] Output: 2
Example 3:
Input: [7,8,9,11,12] Output: 1
Note:
Your algorithm should run in O(n) time and uses constant extra space.
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0] 输出: 3
示例 2:
输入: [3,4,-1,1] 输出: 2
示例 3:
输入: [7,8,9,11,12] 输出: 1
说明:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
8ms
1 class Solution { 2 func firstMissingPositive(_ nums: [Int]) -> Int { 3 if nums.count == 0 {return 1} 4 var nums = nums 5 for i in 0..<nums.count {while nums[i] >= 1 && nums[i] <= nums.count && nums[nums[i] - 1] != nums[i] {nums.swapAt(i, nums[i] - 1)}} 6 for i in 0..<nums.count {if nums[i] != i + 1 {return i + 1}} 7 return nums.count + 1 8 } 9 }
12ms
1 class Solution { 2 func firstMissingPositive(_ nums: [Int]) -> Int { 3 guard nums.count > 0 else { 4 return 1 5 } 6 var numsCopy = nums 7 for i in 0..<nums.count { 8 while numsCopy[i] > 0 && numsCopy[i] < nums.count && numsCopy[numsCopy[i]-1] != numsCopy[i] { 9 numsCopy.swapAt(i, numsCopy[i]-1) 10 } 11 } 12 13 for i in 0..<nums.count { 14 if numsCopy[i] != i + 1 { 15 return i + 1 16 } 17 } 18 return nums.count + 1 19 } 20 }
12ms
1 class Solution { 2 func firstMissingPositive(_ nums: [Int]) -> Int { 3 var newNums = nums 4 for i in 0..<nums.count { 5 while newNums[i] > i + 1 && newNums[i] <= nums.count && newNums[i] != newNums[newNums[i]-1] { 6 if newNums[i] <= nums.count && newNums[i] != newNums[newNums[i]-1] { 7 let temp = newNums[i] 8 newNums[i] = newNums[temp-1] 9 newNums[temp-1] = temp 10 } 11 } 12 if newNums[i] > 0 && i + 1 > newNums[i] { 13 let temp = newNums[i] 14 newNums[i] = newNums[temp-1] 15 newNums[temp-1] = temp 16 } 17 } 18 var i = 0 19 while i < nums.count { 20 if i + 1 != newNums[i] { 21 return i + 1 22 } 23 i = i + 1 24 } 25 return i + 1 26 } 27 }
16ms
1 class Solution { 2 func firstMissingPositive(_ nums: [Int]) -> Int { 3 var set = Set<Int>() 4 5 nums.forEach { set.insert($0) } 6 7 for i in 0..<nums.count { 8 if !set.contains(i + 1) { 9 return i + 1 10 } 11 } 12 13 return nums.count + 1 14 } 15 }
16ms
1 class Solution { 2 func firstMissingPositive(_ nums: [Int]) -> Int { 3 if(nums.count == 0){ return 1 } 4 let maximum = nums.max()! 5 if(maximum > 0){ 6 for i in 1...maximum{ 7 if(!nums.contains(i)){ 8 return i 9 } 10 } 11 } 12 return maximum + 1 13 } 14 }
20ms
1 class Solution { 2 func firstMissingPositive(_ nums: [Int]) -> Int { 3 var nums = nums 4 nums.append(-1) 5 6 if nums.count == 0 {return 1} 7 if nums.count == 1 { return nums[0] == 1 ? 2 : 1 } 8 9 for i in 0..<nums.count { 10 var val = nums[i] 11 while val < nums.count && val >= 0 && nums[val] != val { 12 swap(&nums, i, val) 13 val = nums[i] 14 } 15 if val != i { 16 nums[i] = -1 17 } 18 } 19 for i in 1..<nums.count { 20 if nums[i] == -1 { 21 return i 22 } 23 } 24 return nums.count 25 } 26 27 func swap(_ nums: inout [Int], _ i: Int, _ j: Int) { 28 let temp = nums[i] 29 nums[i] = nums[j] 30 nums[j] = temp 31 } 32 }
32ms
1 class Solution { 2 func firstMissingPositive(_ nums: [Int]) -> Int { 3 for i in 1 ..< Int.max { 4 if !nums.contains(i) { return i } 5 } 6 7 return Int.max 8 } 9 }