数组
关于二维vector:
vector<vector
vector<vector
但是数组不支持变长:
const int N=n; int a[N][N];//错误
const int N=100;int a[N][N];//可以
1.长度最小的子数组
找出该数组中满足其总和大于等于 target 的长度最小的子数组(连续)
思路:双指针
点击查看代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n=nums.size();
int l=0,r=0;
int sum=0,minn=n+1;
while(1){
while(r<n&&sum<target){
sum+=nums[r];
r++;
}
if(sum>=target)minn=min(minn,r-l);
if(r>=n&&sum<target)break;
sum-=nums[l];
l++;
}
if(minn<n+1)return minn;
return 0;
}
};
2.螺旋矩阵
本题是n* n,n*m类似
点击查看代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int l=0,r=n-1,u=0,d=n-1;
int id=1,te;
vector<vector<int>> a(n,vector<int>(n) );//n行n列
while(id<=n*n)
{
te=l;
while(l<=r&&te<=r)a[u][te++]=id++;
u++;te=u;
while(r>=l&&te<=d)a[te++][r]=id++;
r--;te=r;
while(d>=u&&te>=l)a[d][te--]=id++;
d--;te=d;
while(l<=r&&te>=u)a[te--][l]=id++;
l++;
}
return a;
}
};
3.开发商购买土地
描述:
n * m个连续的区块,每个区块都拥有不同的权值,代表着其土地价值。
现在,需要将这个城市区域的所有区块分配给 A 公司和 B 公司。
只允许将区域按横向或纵向划分成两个子区域,而且每个子区域都必须包含一个或多个区块。 为了确保公平竞争,你需要找到一种分配方式,使得 A 公司和 B 公司各自的子区域内的土地总价值之差最小。
思路:前缀和(前缀和一般下标从1开始,方便操作)
点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e6+10;
void solve()
{
int n,m;
cin>>n>>m;
vector<vector<int>>a(n+1,vector<int>(m+1));
vector<int>r(n+1),c(m+1);
for(int i=1;i<=n;i++){
int sum=0;
for(int j=1;j<=m;j++){
cin>>a[i][j];
sum+=a[i][j];
r[i]=r[i-1]+sum;
}
}
for(int i=1;i<=m;i++){
int sum=0;
for(int j=1;j<=n;j++){
sum+=a[j][i];
c[i]=c[i-1]+sum;
}
}
int d=1e9;
for(int i=1;i<n;i++){
d=min(d,abs(r[n]-r[i]-r[i]));
}
for(int i=1;i<m;i++){
d=min(d,abs(c[m]-c[i]-c[i]));
}
cout<<d<<'\n';
}
int main()
{
ll T=1;
// cin>>T;
while(T--)
solve();
return 0;
}
浙公网安备 33010602011771号