• 【算法集训暑期刷题营】7.3日题---前缀和


    算法集训传送门

      👉引言

    在这里插入图片描述

    铭记于心
    🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉

    💖 ❄️我们的算法之路❄️💖

       众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。
                  ☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️
       💝二分,💝贪心,💝并查集,💝二叉树,💝图论,💝深度优先搜索(dfs),💝宽度优先搜索(bfs),💝数论,💝动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉


    今日主题:前缀和


     👉⭐️第一题💎

       ✨题目

           1.区域和检索——数组不可变

       ✨思路

    NumArray初始化数组时建立好一个前缀和数组,随后查询时直接在该sum数组中拿取边界数据即可

       ✨代码

    class NumArray {
    public:
    	vector<int>N;
    	vector<int>sum;
    	NumArray(vector<int>& nums) {
    		N = nums;
            int n = nums.size();
            sum.resize(n);
    		sum[0] = nums[0];
    		for (int i = 1; i < n; i++) {
    			sum[i] = sum[i - 1] + nums[i];
    		}
    	}
    
    	int sumRange(int left, int right) {
    		return sum[right] - sum[left] + N[left];
    	}
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

     👉⭐️第二题💎

       ✨题目

          2.所有奇数长度子数组的和

    对于每一种奇数长度Ni的情况,依次求出所有Ni长度的子数组(从数组首元素开始遍历Ni个数)的和并累加起来

       ✨代码

    class Solution {
    public:
    int add(vector<int>&arr,int i,int j){
        int s=0;
        for(int t=i;t<j;t++){
            s+=arr[t];
        }
        return s;
    }
    int sumOddLengthSubarrays(vector<int>& arr) {
        int S=0;
    	int n = arr.size();
    	for (int i = 1; i <= n; i += 2) {
    		int dd = n - i;
    		for (int j = 0; j <= dd; j += 1)
    		{
    			S+=add(arr,j,i+j);
    		}
    	}
        return S;
    }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

     👉⭐️第三题💎

       ✨题目

          3.和相同的二元子数组

       ✨思路

    哈希表与前缀和结合使用:哈希表存储前缀和,遇到符合题目要求的情况便累加

       ✨代码

    class Solution {
    public:
        int numSubarraysWithSum(vector<int>& nums, int goal) {
        map<int,int>record;
        record[0]++;
        int sum=0,num=0;
        for(auto i:nums){
            num+=i;
            if(record[num-goal])
            sum+=record[num-goal];  
    
           record[num]++;
        }
        return sum;
        }
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

     👉⭐️第四题💎

       ✨题目

          4. Buy a Shovel

       ✨代码

    #include "bits/stdc++.h"
    using namespace std;
     
    #define ll long long
     
    #define       forn(i,n)              for(int i=0;i<n;i++)
    #define          all(v)              v.begin(), v.end()
    #define         rall(v)              v.rbegin(),v.rend()
     
    #define            pb                push_back
    #define          sz(a)               (int)a.size()
    
    
    ll query(int l, int r, vector<ll>& p) {
        return p[r] - (l ? p[l - 1] : 0);
    }
    
    void solve() {  
        int n, s; cin >> n >> s;
        vector<ll> a(n), p(n);
        forn(i, n) {
            cin >> a[i];
            p[i] = a[i];
            if(i) p[i] += p[i - 1];
        }
    
        int ans = INT_MAX;
    
        for(int i = 0; i < n; ++i) {
            int l = i, r = n - 1, pos = -1;
            while(l <= r) {
                int mid = l + r >> 1;
                if(query(i, mid, p) <= s) {
                    pos = mid;
                    l = mid + 1;
                } else r = mid - 1;
            }
            if(pos == -1 || query(i, pos, p) != s) continue;
            ans = min(ans, n - (pos - i + 1));
        }
    
        cout << (ans == INT_MAX ? -1 : ans) << "\n";
    } 
         
    int32_t main() {
        ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
        int t = 1;
        cin >> t;
        while(t--) {
            solve();
        }
    }  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    写在最后
    相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!

  • 相关阅读:
    React 学习笔记目录
    【STM32学习】——SPI通信协议&SPI时序&W25Q64存储芯片&软件SPI读写
    uniapp——上传图片获取到file对象而非临时地址——基础积累
    ubuntu 18及以上版本配置IP的方法,你get了吗
    转化限制+分析变量变化引起的答案变化:Gym - 104065D
    《最新出炉》系列入门篇-Python+Playwright自动化测试-10-标签页操作(tab)
    Redis(6)五大数据类型——List(列表)
    python中的常考知识点
    这个面试题居然从11年前就开始讨论了,而官方今年才表态。
    MySQL性能调优,这个工具最有用(中)
  • 原文地址:https://blog.csdn.net/runofsun/article/details/125609457