1. 程式人生 > 其它 >leetcode(c++)(單調序列)

leetcode(c++)(單調序列)

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

vector<int>maxSlidingWindow(const vector<int>& nums,int k)
{
    int n = nums.size();
    deque<int>q;
    vector<int>res(n-k+1);
    for(int i = 0; i < n; ++i)
    {
        
int start = i-k+1; while(!q.empty() && i - q.front() >= k)q.pop_front(); while(!q.empty() && nums[q.front()] <= nums[i])q.pop_back(); q.push_back(i); if(start >= 0)res[start] = nums[q.front()]; } return res; } void print(const vector<int
>& nums) { for(auto num : nums) { cout << num << " "; } cout << endl; } int shortestSubarray(const vector<int>& A, int k) { int n = A.size(),res = n + 1; vector<int>sum(n + 1); for(int i = 0; i < n; ++i) { sum[i
+1] = sum[i] + A[i]; } deque<int>q; for(int i = 0; i < n + 1 ; ++i) { while(!q.empty() && sum[i] - sum[q.front()] >= k) { res = min(res,i - q.front()); q.pop_front(); } while(!q.empty() && sum[q.front()] >= sum[i])q.pop_back(); q.push_back(i); } return res <= n ? res : -1; } int constrainedSubSum(const vector<int>& nums,int k) { deque<int>q; int n = nums.size(); vector<int>sum(n); int res = sum[0]; for(int i = 0; i < n; ++i) { sum[i] = nums[i]; if(!q.empty())sum[i]+=sum[q.front()]; res = max(res,sum[i]); if(!q.empty() && i - q.front() >= k)q.pop_front(); while(!q.empty() && sum[q.back()] <= sum[i])q.pop_back(); if(sum[i] > 0)q.push_back(i); } return res; } int longestSubarry(const vector<int>& A,int limit) { deque<int>maxd,mind; int left = 0, res = 0; for(int i = 0 ; i < A.size(); ++i) { while(!maxd.empty() && maxd.back() < A[i])maxd.pop_back(); while(!mind.empty() && A[i] < mind.front())mind.pop_back(); maxd.push_back(A[i]); mind.push_back(A[i]); if(maxd.front() - mind.front() > limit) { if(maxd.front() == A[left])maxd.pop_front(); if(mind.front() == A[left])mind.pop_front(); ++left; } res = max(res,i - left + 1); } return res; } int maxResult(const vector<int>& nums,int k) { int n = nums.size(); vector<int>dp(n); dp[0] = nums[0]; deque<int>q; q.push_back(0); for(int i = 0; i < n - 1;++i) { while(!q.empty() && i - q.front() >= k)q.pop_front(); while(!q.empty() && dp[q.front()] <= dp[i])q.pop_back(); q.push_back(i); dp[i+1]=dp[q.front()] + nums[i + 1]; } return dp[n-1]; } int main() { //LeetCode239 vector<int>nums{1,3,-1,-3,5,3,6,7}; int k = 3; print(maxSlidingWindow(nums,k)); //LeetCode862 vector<int>A{1,2}; k = 2; cout << shortestSubarray(A,k) << endl; //LeetCode1425 nums = {10,2,-10,5,20}; k = 2; cout << constrainedSubSum(nums,k) << endl; //LeetCode1438 nums = {8,2,4,7}; k = 4; cout << longestSubarry(nums,k) << endl; //LeetCode1696 nums ={1,-1,-2,4,-7,3}; k = 2; cout << maxResult(nums,k) << endl; return 0; }