209. 长度最小的子数组 - 力扣(LeetCode)
快指针遍历至末尾 慢指针在满足条件的情况下往前走实现收缩,直至不再满足条件,快指针继续向前
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int size = nums.size();
//左闭右开
int left = 0; //闭
int right = 0; //开
int sum = 0;
int min = INT_MAX;
while(right<size){//
sum+=nums[right];//right是开区间,本次可以直接加
right++;
while(sum>=target){
if(min > right - left){
min = right - left ;//立刻记录左右指针
}
sum -= nums[left];
left++;
}
}
return min==INT_MAX?0:min;
}
};
59. 螺旋矩阵 II - 力扣(LeetCode)
注意区间定义,及其对应的边界条件
变量名和逻辑有点混乱,待改进
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> dp(n, vector<int>(n, 0));
int time = n/2;
int start_x = 0;
int start_y = 0;
int k = n-1;
int s = 1;
while(time--){
for(int i = start_x;i < k;i++){
dp[start_y][i] = s;
s++;
start_x++;
}
for(int j = start_y;j < k;j++){
dp[j][start_x] = s;
s++;
start_y++;
}
for(int i = start_x;i>n-k-1;i--){
dp[start_y][i] = s;
s++;
start_x--;
}
for(int j = start_y;j>n-k-1;j--){
dp[j][start_x] = s;
s++;
start_y--;
}
k--;
start_x++;
start_y++;
}
if(n%2==1){
dp[(n-1)/2][(n-1)/2] = s;
}
return dp;
}
};
58. 区间和(第九期模拟笔试)
题目描述
给定一个整数数组
Array,请计算该数组在每个指定区间内元素的总和。输入描述
第一行输入为整数数组
Array的长度n,接下来n行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间下标:a,b (b > = a),直至文件结束。输出描述
输出每个指定区间内元素的总和。
前缀和思路,避免重复计算,提高效率
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n = 0;
cin >> n; //数组长度
vector<int> P(n,0); //记录和
int ele = 0;
for(int i = 0;i<n;i++){
cin >> ele;
if(i==0){
P[i]+=ele;
}
else P[i] = P[i-1]+ele;
}
int a,b;
while(cin>>a>>b){
if(a==0){
cout<<P[b]<<endl;
}
else cout<<P[b]-P[a-1]<<endl;
}
return 0;
}
44. 开发商购买土地(第五期模拟笔试)
分别计算各行和、列和,与一半总数最接近即可
#include<iostream>
#include<vector>
#include <climits>
#include<cmath>
using namespace std;
int main(){
int n = 0;//row
int m = 0;//col
int sum = 0;
cin >> n >>m;
vector<int> rowadd(n); //记录n行的行和
vector<int> coladd(m); //记录m列的列和
vector<vector<int>> dp(n,vector<int>(m,0));
int ele;
for(int i = 0 ;i<n ;i++){
for(int j = 0 ;j<m ;j++){
cin >> ele;
dp[i][j]=ele;
rowadd[i]+=ele;
}
}
//遍历,获得总和and列和
for(int j = 0 ;j<m ;j++){
for(int i = 0 ;i<n ;i++){
coladd[j] += dp[i][j];
sum += dp[i][j];
}
}
vector<int> sigma_r(n,0);
int min_r = INT_MAX ;
for(int i = 0;i<n;i++){
if(i == 0){
sigma_r[i] = rowadd[i];
}
else sigma_r[i] = sigma_r[i-1]+rowadd[i];
min_r = min_r<abs(sum-2*sigma_r[i])?min_r:abs(sum-2*sigma_r[i]);
}
vector<int> sigma_c(m,0);
int min_c = INT_MAX ;
for(int i = 0;i<m;i++){
if(i == 0){
sigma_c[i] = coladd[i];
}
else sigma_c[i] = sigma_c[i-1]+coladd[i];
min_c = min_c<abs(sum-2*sigma_c[i])?min_c:abs(sum-2*sigma_c[i]);
}
cout<<(min_c<min_r?min_c:min_r)<<endl;
}