day2
Leetcode 209
滑动窗口,需要注意的地方是在每次循环之中更新length答案,当满足和大于等于target时开始更新length,left每次累加都会更新length,直到和小于target
while(s>=target)
{
length=min(length,right-left);
s-=nums[left];
left++;
}
滑动窗口和双指针其实是同一个东西,灵茶山艾府将双指针作为滑动窗口的一个子节。,在每次right变化时更新和,每次left更新时更新和。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int s= 0, left = 0,right=0;
int length=INT_MAX;
for (auto num:nums)
{
s+=num;
right++;
while(s>=target)
{
length=min(length,right-left);
s-=nums[left];
left++;
}
}
return length<=nums.size()?length:0;
}
};
Leetcode 59 螺旋矩阵Ⅱ
之前没有做过螺旋矩阵的题,刚开始的思路是找每一行之间的关系,通过遍历来进行赋值,但是思路陷入了死循环,找不到突破口,看了解答后才明白,通过每个大外圈的循环来进行遍历
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<int>temp(n,0);
vector<vector<int>> ans(n,temp);
int loop=n/2;//循环次数
int mid=n/2;
int startx=0;
int starty=0;
int offset=1;
int num=1;
int i=0;
int j=0;
while(loop--)
{
i=startx;
j=starty;
for(j;j<n-offset;++j)
{
ans[i][j]=num;
num++;
}
for(i;i<n-offset;++i)
{
ans[i][j]=num;
num++;
}
for(;j>starty;j--)
{
ans[i][j]=num;
num++;
}
for(;i>startx;i--)
{
ans[i][j]=num;
num++;
}
offset+=1;
startx++;
starty++;
}
if(n%2)//如果n为奇数的话需要考虑中心的值
{
ans[mid][mid]=num;
}
return ans;
}
};
本题明白思路以后,通过画图便于理解,每个行列循环要保持一致
Kamacoder 58 前缀和
前缀和讲解58. 区间和 | 代码随想录
第一次使用kamacoder的界面和leetcode不一样,看了答案才理解编码过程是什么
#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;
}
}
Kamacoder 44 开发商土地
第一反应就是暴力O(n^2)遍历,输入array过程中计算array总和,在经过一次行遍历与一次列遍历,每次遍历到n-1或者m-1时更新result
#include<iostream>
#include<vector>
#include<climits>
using namespace std;
int main()
{
int n,m;
int sum=0;
int sumA=0;
int sumB=0;
vector<vector<int>>field(n,vector<int>(m,0));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>field[i][j];
sum+=field[i][j];
}
}
int result=INT_MAX;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
sumA+=field[i][j];
if(j==m-1)
{
sumB=abs(sum-sumA);
result=min(result,abs(sumA-sumB));
}
}
}
sumA=0;sumB=0;
for(int j=0;j<m;j++)
{
for(int i=0;i<n;i++)
{
sumA+=field[i][j];
if(i==n-1)
{
sumB=abs(sum-sumA);
result=min(result,abs(sumA-sumB));
}
}
}
cout<<result<<endl;
}
浙公网安备 33010602011771号