leetcode update

This commit is contained in:
gameloader 2024-03-16 16:46:07 +08:00
parent a6029b2a76
commit 9978891974

View File

@ -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<sum0{
i, ok := map0[sum1-sum0]
if !ok{
map0[sum1-sum0] = index
}else{
maxarray = max(maxarray, index-i)
}
}else{
maxarray = max(maxarray, index+1)
}
}
return maxarray
}
```
### 总结
本题和前几天的题目在思想上有异曲同工之妙, 也是前缀和的一种应用, 如果把0和1的数量差作为前缀和, 那么本题解题思路可简单概括为找到前缀和相等的位置的最远距离.