209.长度最小的子数组
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int min_len=INT_MAX;
int n=nums.size();
int left=0, sum=0;
for(int right=0;right<n;right++){
sum+=nums[right];
while(sum>=target){
min_len=min(min_len,right-left+1);
sum-=nums[left];
left++;
}
}
return min_len==INT_MAX?0:min_len;
}
};
子数组:要求连续,考虑滑动窗口解法。right指针进行扩张,left指针进行收缩,对所有满足要求的长度取最小即可。
59.螺旋矩阵II
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int left=0, right=n-1, top=0, bottom=n-1;
vector<vector<int>> res(n,vector<int>(n,0));
int num=1;
while(num<=n*n){
for(int i=left;i<=right;i++) //左->右
res[top][i]=num++;
top++;
for(int i=top;i<=bottom;i++) //上->下
res[i][right]=num++;
right--;
for(int i=right;i>=left;i--) //右->左
res[bottom][i]=num++;
bottom--;
for(int i=bottom;i>=top;i--) //下->上
res[i][left]=num++;
left++;
}
return res;
}
};
恐怖如斯的代码掌控力。。
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n,l,r,a;
cin>>n;
vector<int> pre_sum(n);
for(int i=0;i<n;i++){
cin>>a;
if(i>0)
pre_sum[i]=pre_sum[i-1]+a;
else
pre_sum[i]=a;
}
while(cin >> l >> r){
if(l==0)
cout<<pre_sum[r]<<endl;
else
cout<<pre_sum[r]-pre_sum[l-1]<<endl;
}
return 0;
}
开发商购买土地
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main(){
int m,n,min_gap=INT_MAX,sum=0,sum_A=0,sum_B;
cin>>n>>m;
vector<vector<int>> x(n,vector<int>(m,0));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>x[i][j];
sum+=x[i][j];
}
}
vector<int> row(n,0);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
row[i]+=x[i][j];
}
}
vector<int> col(m,0);
for(int j=0;j<m;j++){
for(int i=0;i<n;i++){
col[j]+=x[i][j];
}
}
for(int i=0;i<n-1;i++){
sum_A+=row[i];
sum_B=sum-sum_A;
min_gap=min(min_gap,abs(sum_A-sum_B));
}
sum_A=0;
for(int i=0;i<m-1;i++){
sum_A+=col[i];
sum_B=sum-sum_A;
min_gap=min(min_gap,abs(sum_A-sum_B));
}
cout<<min_gap<<endl;
return 0;
}
按行求和、按列求和,切分的操作就是对【行(列)和】,求前缀和。