1. 【209.长度最小的子数组】
题目链接
滑动窗口思想,类似于双指针。根据窗口的大小和序列和等条件,不断调整快慢指针的移动。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX;
int left = 0;
int windowsize = 0;
int sum = 0;
for(int right = 0;right<nums.size();right++)
{
sum+=nums[right];
if(sum<target)continue;
else{
while(sum>=target)
{windowsize=right-left+1;
result=min(result,windowsize);
sum-=nums[left++];}
}
}
return result<INT32_MAX?result:0;
}
};
2. 【59.螺旋矩阵II】
题目链接
注意边界控制,同时注意最后的结束条件以及会不会漏掉最中间的数字。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>>matrix(n,vector<int>(n));
int num=1;
int left=0,right=n-1,top=0,bottom=n-1;
while(num<n*n)
{
for(int i=left;i<right;i++){
matrix[top][i]=num++;
}
for(int i=top;i<bottom;i++){
matrix[i][right]=num++;
}
for(int i=right;i>left;i--){
matrix[bottom][i]=num++;
}
for(int i=bottom;i>top;i--){
matrix[i][left]=num++;
}
left++;
right--;
top++;
bottom--;
}
if(n%2==1)
{ matrix[n/2][n/2]=n*n;}
return matrix;
}
};
3. 【区间和】(前缀和)
题目链接
熟悉区间和,尤其是前缀和的巧妙使用。
# include<iostream>
# include<vector>
using namespace std;
int main(){
int n;
cin>>n;
vector<int>nums(n);
for(int i=0;i<n;i++){
cin>>nums[i];
}
vector<int>foresum(n);
foresum[0]=nums[0];
for(int i=1;i<n;i++){
foresum[i]=foresum[i-1]+nums[i];
}
int left,right;
while(cin>>left>>right)
{
cout<<foresum[right]-foresum[left]+nums[left]<<endl;
}
}
4. 【开发商购买土地】
题目链接
前缀和简单应用
#include<iostream>
#include<vector>
#include<climits>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
vector<vector<int>>matrix(n,vector<int>(m));
int sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>matrix[i][j];
sum+=matrix[i][j];
}
}
vector<int>row_sum(n,0);
vector<int>column_sum(m,0);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
row_sum[i]+=matrix[i][j];
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
column_sum[i]+=matrix[j][i];
}
}
int result=INT_MAX;
int row_cut=0;
for(int i=0;i<n;i++){
row_cut+=row_sum[i];
result=min(result,abs(sum-row_cut-row_cut));
}
int column_cut=0;
for(int i=0;i<m;i++){
column_cut+=column_sum[i];
result=min(result,abs(sum-column_cut-column_cut));
}
cout<<result<<endl;
}
数组部分总结:
采用知识星球前辈“海螺人”所画图,结合题目收获颇多,以总结。