Contents

ARST打卡第167周[167/521]

Algorithm

lc565_数组嵌套

看数据范围好像就是可以用暴力算法的,O(n^2)就是4e8,在超时边界上,但是写的过程中想到了判断环的思路

花了90分钟AC,太离谱了,太慢了,go语言基础也不太行,还是要多练…

然后发现题解比我的优化了整整两次

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
func arrayNesting(nums []int) int {
	// 在准备先写暴力算法的时候,在想状态标记每次修改应该比较麻烦
	// 然后想到如果一个数字已经遍历过了,那么它在那个嵌套里面的值就一直是那个值
	// 然后其他的数字看到了之前的嵌套环的话,那么就是直接把自身的cnt步数直接加上原来的环中的数
	// invalid array length sz. 数组只能用常量声明
	// var cnt [sz]int
	cnt := make([]int, len(nums))
	ans := 0
	for i := range nums {
		if cnt[i] != 0 {
			continue
		}
		tmpMap := make(map[int]bool)
		// tmp := make([]int, 0)
		tmpCnt := 0
		// 循环条件搞错了...
		// for 0 == cnt[i] {
		// fmt.Printf("debug: term new---\n")
		for !tmpMap[i] || cnt[i] != 0 {
			tmpMap[i] = true
			// tmp = append(tmp, i)
			tmpCnt++
			i = nums[i]
		}
		// fmt.Printf("debug: i: %v tmp[i]: %v\n", i, tmpMap[i])
		/*
			遍历为集合map,会导致结果混乱,所以不能用map遍历
			debug: i: 0 tmp[i]: true
			debug: index: 6
			debug: index: 2
			debug: index: 0
			debug: index: 5
			debug: ans: 8
		*/
		// for index := range tmp {
		preCnt := cnt[i]
		for index := range tmpMap {
			// fmt.Printf("debug: index: %d\n", index)
			// 之前的环值也需要加入
			// 这样加入: cnt[index] = cnt[i] + tmpCnt,不管是map还是数组,都会出问题
			cnt[index] = preCnt + tmpCnt
			if cnt[index] > ans {
				ans = cnt[index]
			}
		}
		// fmt.Printf("debug: ans: %v\n", ans)
	}
	return ans
}

题解:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func arrayNesting(nums []int) (ans int) {
    n := len(nums)
    for i := range nums {
        cnt := 0
        for nums[i] < n {
            i, nums[i] = nums[i], n
            cnt++
        }
        if cnt > ans {
            ans = cnt
        }
    }
    return
}
// 链接:https://leetcode.cn/problems/array-nesting/solution/shu-zu-qian-tao-by-leetcode-solution-7ur3/

Review

【TED演讲】我们可以从捷径中学到了什么?

世界上唯一不变的东西就是变

所以很多道路设计,产品设计,都不是你闭门造车设计出来的最好

而是快速上线产品,然后不断听取用户意见,不断根据用户,变化改进才能做出最适合人的产品

Tips

localhost和127.0.0.1有什么区别?

Share

分享好书-advance-go,有很多高级的go扩展用法,非常好的全面使用概貌

工作之余一定要抬头看书,看路,因为自己最近看书的过程,让工作中不理解的地方,突然就理解了,所以业余看书很重要