leetcode41

 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,但是感觉怪怪的。

复杂的算法虽好但是想多了容易掉头发,有时性能不够可以用语言和硬件改善嘛。以人为本,珍爱生命,远离强迫症。

原文地址:https://www.cnblogs.com/asenyang/p/10491948.html