长度最小子数组
原题链接:长度最小子数组
思路:最容易想到遍历得到每个子数组,获取其和,找到最小长度,在这个基础上用前缀和优化。同时,容易发现,当一个子数组满足条件后,再扩大数组,一定不符合找最小要求。当满足田间后,我们可以缩短末尾,直到条件不再被满足,而后继续在开头添加元素
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0;
int right = 0;
int result = nums.size()+5;
int sum = 0;
for(right = 0;right<nums.size();right++){
sum+=nums[right];
while(sum>=target){
result = min(result,right-left+1);
sum-=nums[left];
left++;
}
}
if(result == (nums.size()+5))
result = 0;
return result;
}
};
螺旋矩阵
原题链接:螺旋矩阵
思路:用模拟走路的思路,知晓一共要走n*n步,分四个方向循环,循环条件为遇到边缘,或者已经走过了。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int dir[4][2] = {
{0,1},{1,0},{0,-1},{-1,0}
};
vector<vector<int>>v(n , vector<int>(n));
int nums = 2;
int x = 0, y = 0;
int diri = 0;
v[0][0] = 1;
while (nums <= n * n) {
int tx = x + dir[diri][0];
int ty = y + dir[diri][1];
if (check(n, tx, ty) && v[tx][ty] == 0) {
v[tx][ty] = nums++;
x = tx;
y = ty;
}
else {
diri = (diri + 1) % 4;
}
}
return v;
}
bool check(int n,int x,int y){
if(x>=n || x<0 || y>=n ||y<0)
return false;
return true;
}
};
分割土地
原题链接:分割土地
思路:容易想到使用两次循环,对矩阵进行分割,每次分割后对分割后的矩阵进行计算,计算过程使用前缀和优化
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main () {
int n, m;
cin >> n >> m;
int sum = 0;
vector<vector<int>> vec(n, vector<int>(m, 0)) ;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> vec[i][j];
sum += vec[i][j];
}
}
vector<int> horizontal(n, 0);
for (int i = 0; i < n; i++) {
for (int j = 0 ; j < m; j++) {
horizontal[i] += vec[i][j];
}
}
vector<int> vertical(m , 0);
for (int j = 0; j < m; j++) {
for (int i = 0 ; i < n; i++) {
vertical[j] += vec[i][j];
}
}
int result = INT_MAX;
int horizontalCut = 0;
for (int i = 0 ; i < n; i++) {
horizontalCut += horizontal[i];
result = min(result, abs(sum - horizontalCut - horizontalCut));
}
int verticalCut = 0;
for (int j = 0; j < m; j++) {
verticalCut += vertical[j];
result = min(result, abs(sum - verticalCut - verticalCut));
}
cout << result << endl;
}
297

被折叠的 条评论
为什么被折叠?



