暑假算法7.16,Day15
前缀和,双指针,哈希表,简单模拟搜索
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int count=0;
for(int a:nums){
count+=a;
}
int sum = 0;
for (int i = 0; i < nums.size(); ++i) {
if (2 * sum + nums[i] == count) {
return i;
}
sum += nums[i];
}
return -1;
}
};
第二题
class Solution {
public:
int subarraysDivByK(vector<int>& nums, int k) {
unordered_map<int, int> p={{0, 1}}; //初始化,考虑前缀和本身可以整除k的情况
int modules; //存储对k取模后的余数
int ans = 0;
int sum = 0;
for(int n : nums){
sum += n; //计算前缀和
modules = (sum % k + k)% k; //考虑前缀和有可能为负数的情况,所以加一个k,使得取模后结果都为正数。
if(p.count(modules)){ //如果存在同余的前缀和
ans += p[modules]; //加上所有与目前的前缀和同余的历史前缀和个数
}
p[modules]++; //更新哈希表
}
return ans;
}
};
第三题
class Solution {
const int mod=1e9+7;
public:
long long countSubarrays(vector<int>& nums, long long k) {
long long ans = 0;
long long sum = 0;
/* 双指针, 满足条件窗口变大, 不满足条件, 窗口缩小 */
for (int i = 0, j = 0; j < nums.size(); j++) {
sum += nums[j];
while ((j - i + 1) * sum >= k) {
sum -= nums[i++];
}
ans += j - i + 1;
}
return ans;
}
};
第四题
题目意思是:
有两排人进行拍照,前面人的高度+x需要小于后面一排对应位置的人的高度。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N;
cin>>N;
while(N--){
int a[2022];
int n,x;
cin>>n>>x;
bool flag=true;
for(int i=0;i<2*n;i++){
cin>>a[i];
}
sort(a,a+2*n);//从小到大排序
for(int i=0;i<n;i++){
if(a[i]+x>a[i+n]){//只要有一个前排的人+x高于后排的人就跳出循环,不满足条件。
flag=false;
break;
}
}
if(flag){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}