給你一個正整數數組?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
分析:用一個 index 數組,記錄 nums 數組中每個數出現的下標,初始化為 -1。遍歷 nums 數組,最初時取得的最優子數組區間的左端點 l = 0,右端點為循環下標 i。如果 nums[i] 為 -1,說明還沒有出現過,則將當前的子數組和 sum 加上 nums[i],并修改 index[nums[i]] = i。如果nums[i] 不為 -1,則將 l 到 nums[i] 的所有值從 sum 中減去, 并更新 index 數組中對應值的下標為 -1,表示去掉這些值,最后把 l 更新為上一次 nums[i] 出現位置的后一位。遍歷完數組,取 sum 的最大值即可。
int maximumUniqueSubarray(int* nums, int numsSize) {int index[100010]={0};for(int i=0;i<100010;++i)index[i]=-1;int ans=0,sum=0,l=0;for(int i=0;i<numsSize;++i){if(index[nums[i]]!=-1) {int r=index[nums[i]];for(int j=l;j<=r;++j)sum-=nums[j],index[nums[j]]=-1;l=r+1;}sum+=nums[i],index[nums[i]]=i,ans=fmax(sum,ans);}ans=fmax(sum,ans);return ans;
}