mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-05 00:25:22 +08:00
Add solution 228、1694、1695
This commit is contained in:
@ -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
|
||||
}
|
@ -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")
|
||||
}
|
74
leetcode/1695.Maximum-Erasure-Value/README.md
Normal file
74
leetcode/1695.Maximum-Erasure-Value/README.md
Normal 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
|
||||
}
|
||||
```
|
Reference in New Issue
Block a user