一.长度最小的子数组
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result=INT32_MAX;;
int sum=0;
int i=0;
int length=0;
for(int j=0;j<nums.size();j++)
{
sum+=nums[j];
while(sum>=target)
{
length=j-i+1;
result=min(result,length);
sum=sum-nums[i];
i++;
}
}
return result==INT32_MAX?0:result;
}
};
感悟:用的滑动窗口的思想,遍历的是终止位置,如果遍历起始位置就跟暴力法没什么区别了。做完思考的时候还在想为什么for里一个while时间复杂度会是O(n),跟暴力法有什么区别,看了题解才知道主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。
二.螺旋矩阵
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));
int startx=0;
int starty=0;
int loop=n/2;
int mid=n/2;
int i,j;
int count=1;
int offest=1;
while(loop--)
{
i=startx;
j=starty;
for(j;j<n-offest;j++)
{
res[i][j]=count++;
}
for(i;i<n-offest;i++)
{
res[i][j]=count++;
}
for(;j>starty;j--)
{
res[i][j]=count++;
}
for(;i>startx;i--)
{
res[i][j]=count++;
}
startx++;
starty++;
offest+=1;
}
if(n%2==1) res[mid][mid]=count;
return res;
}
};
感悟:思路不难。写的时候细心点就行。
三.区间和
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, a, b;
cin >> n;
vector<int> vec(n);
vector<int> p(n);
int presum = 0;
for (int i = 0; i < n; i++) {
cin >> vec[i];
presum += vec[i];
p[i] = presum;
}
while (cin >> a >> b) {
int sum;
if (a == 0) sum = p[b];
else sum = p[b] - p[a - 1];
cout << sum << endl;
}
}
感悟:对ACM模式的输入输出还不太熟练,得多加练习,思路容易理解,但暴力法会超时。
四.开发商购买土地
看不懂题目,不想做了,放弃了。。。