1695. 删除子数组的最大得分-哈希表+双指针
给你一个正整数数组 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]
很不错的一个题目,解题代码如下,感兴趣的,可以多学习学习:
#define size 10001
struct hash{
struct hash *next;
int index;
};
void add_hash(struct hash *h,int index){
struct hash *p=(struct hash *)malloc(sizeof(struct hash ));
p->index=index;
p->next=h->next;
h->next=p;
}
bool find_hash(struct hash *h){
struct hash *p=h->next;
if(p){
return true;
}
else{
return false;
}
}
int maximumUniqueSubarray(int* nums, int numsSize){
struct hash *h=(struct hash *)malloc(sizeof(struct hash )*size);
struct hash *p;
for(int i=0;i<size;i++){
(h+i)->next=NULL;
}
int low=0,high=0;
int max=0;
int sum=0;
while(high!=numsSize){
while(!find_hash(h+nums[high])){
add_hash(h+nums[high],high);
sum=sum+nums[high];
high++;
if(high==numsSize){
break;
}
}
max=fmax(max,sum);
sum=sum-nums[low];
p=h+nums[low];
p->next=p->next->next;
low++;
if(low==numsSize){
break;
}
}
return max;
}