Add solution 228、1694、1695

This commit is contained in:
YDZ
2021-01-12 11:04:25 +08:00
parent 1bc9d34209
commit fbbc4ff73a
16 changed files with 1618 additions and 828 deletions

View File

@ -0,0 +1,30 @@
package leetcode
func maximumUniqueSubarray(nums []int) int {
if len(nums) == 0 {
return 0
}
result, left, right, freq := 0, 0, -1, map[int]int{}
for left < len(nums) {
if right+1 < len(nums) && freq[nums[right+1]] == 0 {
freq[nums[right+1]]++
right++
} else {
freq[nums[left]]--
left++
}
sum := 0
for i := left; i <= right; i++ {
sum += nums[i]
}
result = max(result, sum)
}
return result
}
func max(a int, b int) int {
if a > b {
return a
}
return b
}

View File

@ -0,0 +1,47 @@
package leetcode
import (
"fmt"
"testing"
)
type question1695 struct {
para1695
ans1695
}
// para 是参数
// one 代表第一个参数
type para1695 struct {
nums []int
}
// ans 是答案
// one 代表第一个答案
type ans1695 struct {
one int
}
func Test_Problem1695(t *testing.T) {
qs := []question1695{
{
para1695{[]int{4, 2, 4, 5, 6}},
ans1695{17},
},
{
para1695{[]int{5, 2, 1, 2, 5, 2, 1, 2, 5}},
ans1695{8},
},
}
fmt.Printf("------------------------Leetcode Problem 1695------------------------\n")
for _, q := range qs {
_, p := q.ans1695, q.para1695
fmt.Printf("【input】:%v 【output】:%v\n", p, maximumUniqueSubarray(p.nums))
}
fmt.Printf("\n\n\n")
}

View File

@ -0,0 +1,74 @@
# [1695. Maximum Erasure Value](https://leetcode.com/problems/maximum-erasure-value/)
## 题目
You are given an array of positive integers `nums` and want to erase a subarray containing **unique elements**. The **score** you get by erasing the subarray is equal to the **sum** of its elements.
Return *the **maximum score** you can get by erasing **exactly one** subarray.*
An array `b` is called to be a subarray of `a` if it forms a contiguous subsequence of `a`, that is, if it is equal to `a[l],a[l+1],...,a[r]` for some `(l,r)`.
**Example 1:**
```
Input: nums = [4,2,4,5,6]
Output: 17
Explanation: The optimal subarray here is [2,4,5,6].
```
**Example 2:**
```
Input: nums = [5,2,1,2,5,2,1,2,5]
Output: 8
Explanation: The optimal subarray here is [5,2,1] or [1,2,5].
```
**Constraints:**
- `1 <= nums.length <= 105`
- `1 <= nums[i] <= 104`
## 题目大意
给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。返回 只删除一个 子数组可获得的 最大得分 。如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],a[l+1],...,a[r] 那么它就是 a 的一个子数组。
## 解题思路
- 读完题立马能识别出这是经典的滑动窗口题。利用滑动窗口从左往右滑动窗口,滑动过程中统计频次,如果是不同元素,右边界窗口又移,否则左边窗口缩小。每次移动更新 max 值。最终扫完一遍以后max 值即为所求。
## 代码
```go
package leetcode
func maximumUniqueSubarray(nums []int) int {
if len(nums) == 0 {
return 0
}
result, left, right, freq := 0, 0, -1, map[int]int{}
for left < len(nums) {
if right+1 < len(nums) && freq[nums[right+1]] == 0 {
freq[nums[right+1]]++
right++
} else {
freq[nums[left]]--
left++
}
sum := 0
for i := left; i <= right; i++ {
sum += nums[i]
}
result = max(result, sum)
}
return result
}
func max(a int, b int) int {
if a > b {
return a
}
return b
}
```