• leetcode(c++)(前缀和)


    #include <iostream>
    #include <vector>
    #include <unordered_map>
    #include <queue>
    using namespace std;
    
    int subarraySum(const vector<int>& nums,int target)
    {
        unordered_map<int,int>map;
        int sum = 0, res = 0;
        map[0] = 1;
        for(int num:nums)
        {
            sum += num;
            if(map.count(sum - target))res+=map[sum - target];
            ++map[sum];
        }
        return res;
    }
    
    int subarrayDivByK(const vector<int>& nums,int k)
    {
        unordered_map<int,int>map;
        map[0] = 1;
        int prefix = 0,res = 0;
        for(int num:nums)
        {
            prefix = (prefix + num % k + k) % k;
            res += map[prefix];
            ++map[prefix];
        }
        return res;
    }
    
    bool checkSubArraySum(const vector<int>& nums, int k)
    {
        int sum = 0;
        unordered_map<int,int>map;
        map[0] = -1;
        for(int i = 0; i < nums.size(); ++i)
        {
            sum += nums[i];
            if(k != 0)sum %= k;
            if(map.count(sum))
            {
                if(i - map[sum] > 1)return true;
            }
            else
            {
                map[sum] = i;
            }
        }
        return false;
    }
    
    int findMaxLen(vector<int>& nums)
    {
        for(int i = 0; i < nums.size(); ++i)
        {
            if(nums[i] == 0)nums[i] = -1;
        }
        int res = 0,sum = 0;
        unordered_map<int,int>map;
        map[0] = -1;
        for(int i = 0; i < nums.size(); ++i)
        {
            sum += nums[i];
            if(map.count(sum)) res = max(res,i-map[sum]);
        }    
        return res;
    }
    
    vector<int>getModifiedArray(int length, const vector<vector<int>>& updates)
    {
        vector<int>res(length,0);
        for(auto update:updates)
        {
            int val = update[2];
            int start = update[0];
            int end = update[1];
            res[start]+=val;
            if(end < length - 1)res[end + 1]-=val;
        }
        int sum = 0;
        for(int i = 0; i < length; ++i)
        {
            sum += res[i];
            res[i] = sum;
        }
        return res;
    }
    
    void print(const vector<int>& nums)
    {
        for(int num : nums)
        {
            cout << num << " ";
        }
        cout << endl;
    }
    
    int minSubArrayLen(const vector<int>& nums,int target)
    {
        int left = 0, n = nums.size(), res = INT_MAX, sum = 0;
        for(int i = 0; i < n; ++i)
        {
            sum += nums[i];
            while(sum >= target)
            {
                res = min(res,i - left + 1);
                sum -= nums[left++];
            }
        }
        return res == INT_MAX ? 0 : res;
    }
    
    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[q.front()] >= sum[i])q.pop_back();
            while(!q.empty() && sum[i] - sum[q.front()] >= k)
            {
                res = min(res,i - q.front());
                q.pop_front();
            }
            q.push_back(i);
        }
        return res <= n ? res : -1;
    }
    
    int main()
    {
        //LeetCode560
        vector<int>nums{1,2,3};
        int k = 3;
        cout << subarraySum(nums,k) << endl;
    
        //LeetCode974
        nums={4,5,0,-2,-3,1};
        k = 5;
        cout << subarrayDivByK(nums,k) << endl;
    
        //LeetCode523
        nums = {23,2,4,6,7};
        k = 6;
        cout << checkSubArraySum(nums,k) << endl;
    
        //LeetCode525
        nums = {0,1,0};
        cout << findMaxLen(nums) << endl;
    
        //LeetCode370
        int len = 5;
        vector<vector<int>>updates{{1,3,2},{2,4,3},{0,2,-2}};
        print(getModifiedArray(len,updates));
    
        //LeetCode209
        int target = 7;
        nums = {2,3,1,2,4,3};
        cout << minSubArrayLen(nums,target) << endl;
    
        //LeetCode862
        nums = {2,-1,2};
        k = 3;
        cout << shortestSubarray(nums,k) << endl;
        return 0;
    }
  • 相关阅读:
    C#实现断点续传
    记住密码"功能的正确设计
    异常处理的性能开销
    asp.net提高程序性能的技巧(一)
    C#创建文件夹
    一个商人应遵守的22条规矩
    列不属于表--可能出现的问题总结
    存储过程无法得到返回型参数
    通用存储过程(增、删、改、查询分页)
    Mac下使用Charles抓包https接口
  • 原文地址:https://www.cnblogs.com/fourmi/p/16260379.html
Copyright © 2020-2023  润新知