leetcode - 1695 - 刪除子陣列的最大得分 - 雙指標 - 雜湊
阿新 • • 發佈:2020-12-22
歡迎關注更多精彩
關注我,學習常用演算法與資料結構,一題多解,降維打擊。
文章目錄
題目描述
[1695] 刪除子陣列的最大得分
- https://leetcode-cn.com/problems/maximum-erasure-value/
給你一個正整數陣列 nums ,請你從中刪除一個含有 若干不同元素 的子陣列。刪除子陣列的 得分 就是子陣列各元素之 和 。
返回 只刪除一個 子陣列可獲得的 最大得分 。
如果陣列 b 是陣列 a 的一個連續子序列,即如果它等於 a[l],a[l+1],…,a[r] ,那麼它就是 a 的一個子陣列。
示例 1:
輸入:nums = [4,2,4,5,6]
輸出:17
解釋:最優子陣列是 [2,4,5,6]
示例 2:
輸入:nums = [5,2,1,2,5,2,1,2,5]
輸出:8
解釋:最優子陣列是 [5,2,1] 或 [1,2,5]
提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^4
- 雙指標
- 雜湊
- 陣列
題目剖析&資訊挖掘
此題與
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
解題思路
方法一 雙指標雜湊法
思路
- 設定2個指標i, j分別表示當前選中序列中的頭和尾,sum為 i到j數字的和。
- j不停往前走(sum加上相應的數字),判斷i, j中是不是有重複
- 如果重複肯定是nums[j]重複,把i往前移(sum減去相應的數字)。
- 取所有sum中最大值即為答案
- i, j最多移動n次,複雜O(n)
注意
- i 始終<= j
- sum 要相應同步
知識點
- 雙指標
- 雜湊
- 陣列
複雜度
- 時間複雜度:O(n)
- 空間複雜度:O(n)
參考
程式碼實現
func maximumUniqueSubarray(nums []int) int { m := make(map[int]int, 1000) sum :=0 maxSum :=0 for i,j:=0,0;j<len(nums);j++ { m[nums[j]]++ sum += nums[j] for ;i<j && m[nums[j]]>1 ; i++ { sum -= nums[i] m[nums[i]]-- } if sum>maxSum { maxSum = sum } } return maxSum }
相關題目
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
最長不重複子串
本人碼農,希望通過自己的分享,讓大家更容易學懂計算機知識。