diff --git a/content/posts/leetcode.md b/content/posts/leetcode.md index 6d1a0f4..13d4c33 100644 --- a/content/posts/leetcode.md +++ b/content/posts/leetcode.md @@ -1295,3 +1295,59 @@ func productExceptSelf(nums []int) []int { ``` 其实无论是前缀和还是前缀积, 都是一个对以往的计算状态的保留, 保存了更多的信息, 避免了重复的运算, 这种思想是值得细细品味的. + +## day19 525. Contiguous Array + +Given a binary array nums, return the maximum length of a contiguous subarray with an equal number of 0 and 1. + +![0316T5HJJzrn5slt](https://testingcf.jsdelivr.net/gh/game-loader/picbase@master/uPic/0316T5HJJzrn5slt.png) + +### 题解 + +考虑本题若想找到到某一个位置处的0和1数量相同的最长子数组长度, 只需要根据到该下标处的0和1数量的差值, 找出符合这个差值的最小下标, 用当前下标减去这个差值下标, 得到的即为0和1数量相同的子数组的长度. 关键在于想要让0和1数量相同, 需要找出能消除当前0和1数量差值的位置. 0和1数量对于寻找相同数量子数组用处不大, 二者数量的差值对于构造一个数量相同的子数组至关重要. 通过加上或减去二者的数量差即可构造出二者数量相同的子数组. 考虑清楚这一点, 思路就很清晰了. + +1. 遍历数组, 保存到当前位置0和1的数量 +2. 计算二者的差值, 在一个哈希表中寻找以这个差值为key的项是否存在, 不存在则将差值为key, 当前下标作为该key对应的值插入哈希表. 若存在则用当前下标减去哈希表中以差值作为key的对应的下标值, 即得到到当前位置0和1数量相同的最长子数组的长度. 比较这个长度和保存的最长子数组长度, 更新最长子数组长度. + +关键在与将差值作为key下标作为value插入哈希表后, 后续有相同的差值作为key时不在更新哈希表, 这样保存的就是符合这个差值的位置的最小值, 也就能构造出最长的0和1数量相同的子数组. + +### 代码 + +```go +func findMaxLength(nums []int) int { + map0 := map[int]int{} + map1 := map[int]int{} + sum0 := 0 + sum1 := 0 + maxarray := 0 + for index,value := range nums{ + if value == 1{ + sum1++ + }else{ + sum0++ + } + if sum1>sum0{ + i, ok := map1[sum1-sum0] + if !ok{ + map1[sum1-sum0] = index + }else{ + maxarray = max(maxarray, index-i) + } + }else if sum1