1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func firstMissingPositive(nums []int) int { 8 m := make(map[int]int) 9 for a := 0; a < len(nums); a++ { 10 if nums[a] > 0 { 11 _, ok := m[nums[a]] 12 if ok == false { 13 m[nums[a]] = nums[a] 14 } 15 } 16 } 17 i := 1 18 _, ok := m[i] 19 for ok { 20 i = i + 1 21 _, ok := m[i] 22 if ok == false { 23 break 24 } 25 } 26 return i 27 } 28 func main() { 29 var n []int 30 n = append(n, 7) 31 n = append(n, 8) 32 n = append(n, 9) 33 n = append(n, 11) 34 n = append(n, 12) 35 r := firstMissingPositive(n) 36 fmt.Println(r) 37 }
第一次遍历:用一个map记录所有出现过的值,这里忽略掉所有非正数(小于等于0的)。
第二次遍历:从1开始,判断是否在map中,如果在map中继续判断下一个数字,一直到第一个不在字典中的值,则为所求。
17-25行是想写个do while,但是感觉怪怪的。
复杂的算法虽好但是想多了容易掉头发,有时性能不够可以用语言和硬件改善嘛。以人为本,珍爱生命,远离强迫症。