1. 程式人生 > 其它 >leetcode - 1695 - 刪除子陣列的最大得分 - 雙指標 - 雜湊

leetcode - 1695 - 刪除子陣列的最大得分 - 雙指標 - 雜湊

技術標籤:leetcodeleetcode雜湊

歡迎關注更多精彩
關注我,學習常用演算法與資料結構,一題多解,降維打擊。

文章目錄

題目描述

[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

Related Topics
  • 雙指標
  • 雜湊
  • 陣列

題目剖析&資訊挖掘

此題與
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/
最長不重複子串


本人碼農,希望通過自己的分享,讓大家更容易學懂計算機知識。

在這裡插入圖片描述