铭记于心 | ||
---|---|---|
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉 |
众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。
☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️
💝二分,💝贪心,💝并查集,💝二叉树,💝图论,💝深度优先搜索(dfs),💝宽度优先搜索(bfs),💝数论,💝动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉
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];
}
};
对于每一种奇数长度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;
}
};
哈希表与前缀和结合使用:哈希表存储前缀和,遇到符合题目要求的情况便累加
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;
}
};
#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();
}
}
写在最后:
相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!