1695. 删除子数组的最大得分-哈希表+双指针

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;



}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值