数组

关于二维vector:
vector<vector> a(n,vector(n) );//n行n列(n为输入变量)
vector<vector> a(n,vector() );//n行,不指定列数
但是数组不支持变长:
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;
}



posted @ 2026-01-01 23:56  spark_of_fire  阅读(0)  评论(0)    收藏  举报