美文网首页
2022-07-09

2022-07-09

作者: NeverFade | 来源:发表于2022-07-09 17:48 被阅读0次

    很经典的一道题,用到的一个小技巧可以积累,就是对一个子数组进行动态优先队列的构建,用值和下标构建pair插入优先队列,每次调用最值前,弹出窗口范围外的元素,很经典,值得学习和积累

    class Solution {
    public:
        int maxResult(vector<int>& nums, int k) {
            
            int n = nums.size();
            if(n==1)
                return nums[0];
            if(n==2)
                return nums[0]+nums[1];
            vector<int> dp(n, INT_MIN/2);
            dp[n-1] = nums[n-1];
            int b = n-1;
            int a = n-1-k;
            priority_queue<pair<int,int>, vector<pair<int,int>>>pq;
            pq.push({nums[n-1], b});
            int sum = nums[0]+nums[n-1];
            for(int i=b-1; i>a && i>=0; i--){
                dp[i] = pq.top().first + nums[i];
                pq.push({dp[i], i});
                if(i>0 && nums[i]>0)
                    sum += nums[i];
            }
            if(k>=n)
                return sum;
            for(int i=a; i>=0; i--){
                while(pq.size() && pq.top().second>i+k)
                    pq.pop();
                dp[i] = pq.size()? pq.top().first:0;
                dp[i] += nums[i];
    
                pq.push({dp[i],i});
            }
    
            return dp[0];
        }
    };
    

    相关文章

      网友评论

          本文标题:2022-07-09

          本文链接:https://www.haomeiwen.com/subject/iskibrtx.html