一、长度最小的子数组
题目链接: . - 力扣(LeetCode)
方法一:暴力解法
固定left,右移right,满足条件后,比较最小长度,判断是否改变最小长度。break
然后向右移动left,以新的left位置右移right,依次寻找满足条件的长度,直到数组结束。
方法二:滑动窗口方法
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum=0;
int length=0;
int result=INT32_MAX;
int left=0;
for(int right=0;right<nums.size();right++)
{
sum+=nums[right];
while(sum>=target)
{
length=right-left+1;
result=result>length?length:result;
sum-=nums[left];
left++;
}
}
return result==INT32_MAX?0:result;
};
1.right移动的目的:找到最小的满足target的位置
left移动的目的:在满足target后,缩小数组,计算最小长度
2.循环结束:right移动到了数组最后一位,若无满足条件的则退出循环
有满足条件的,left移动到本次窗口最小满足位置,退出循环
3.采用以下语句来给出数组全部之和不满足条件的情况
return result==INT32_MAX?0:result;
4.时间复杂度:O(n)
二、螺旋矩阵
题目链接: . - 力扣(LeetCode)
1.二维,用坐标表示位置和数组中插入的位置
2.循环不变量,保证每一次访问都是相同的规则(左闭右开)
3.上层和右层是到循环的边界,即n的位置,由于左闭右开,所以到n-offset
4.下层和左边遍历是回到本圈的起点,所以终止条件是startx,starty
5.注意最后的奇数的中间填充mid=n/2
6.用count表示插入的元素,用i,j表示插入的位置,主要问题是遍历i,j如何在正确的位置插入
代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n, 0));
int startx=0,starty=0;
int i=0,j=0;
int offset=1;
int count=1;
int mid=n/2;
int circle=n/2;//偶数只有圈,奇数中间有一个元素
while(circle--)
{ //每一圈的起始坐标
i=startx;
j=starty;
for(j;j<n-offset;j++)
{
result[i][j]=count++;
}
for(i;i<n-offset;i++)
{
result[i][j]=count++;
}
for(;j>starty;j--)
{
result[i][j]=count++;
}
for(;i>startx;i--)
{
result[i][j]=count++;
}
//进入下一圈
startx++;
starty++;
offset++;
}
if(n%2)
{
result[mid][mid]=count;
}
return result;
}
};
三、区间和
文章讲解: 58. 区间和 | 代码随想录
1.先计算前缀和的表格,用于计算区间和
2.大数据量查询时,本方法大大降低时长
3.如果我们要求区间下标[2, 5的区间和,那么应该是 p[5] - p[1],而不是 p[5] - p[2]。不难想象,p[2]中包含2的值,求[2, 5]的区间和,应该要使用p[1]
代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n,a,b;
cin>>n;
int presum=0;
int sum;
vector<int> vec(n);//用于计算前缀表
vector<int> p(n);//前缀表
for(int i=0;i<n;i++)
{ scanf("%d", &vec[i]);//输入函数
presum+=vec[i];
p[i]=presum;
}
while (~scanf("%d%d", &a, &b))//循环输入,直到回车
{
sum=0;
if(a==0)
sum=p[b];//防止a-1越界
else
sum=p[b]-p[a-1];
printf("%d\n", sum);//输出函数
}
}
四、总结
方法:二分法,暴力求解,双指针法,滑动窗口法,前缀表法
注意:保持循环不变量