卡哥建议:(1)关键在于理解双指针思想 ;
(2)本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。
重点:
链接:代码随想录:代码随想录 (programmercarl.com)
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目建议:本题关键在于理解双指针思想
文章链接:代码随想录
看到题目的第一思路:冒泡排序了,
class Solution {
public:
vector sortedSquares(vector& nums) {
//数组大小
int size=nums.size()-1;
//先平方;在排序
for(int i=0;i<=size;i++)
{
nums[i]*=nums[i];
}
//冒泡排序--非递减
for(int i=0;i<=size;i++)
{
for (int j=i+1;j<=size;j++)
{
if(nums[i]>=nums[j])
{
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
}
return nums;
}
};
看完代码随想录之后的想法:这是容器,有算法的,不用自己苦哈哈排序
暴力解法:
class Solution {
public:
vector sortedSquares(vector& nums) {
//先平方
for (int i = 0; i < nums.size(); i++) {
nums[i] *= nums[i];
}
sort(nums.begin(), nums.end()); // 快速排序
return nums;
}
};
看完代码随想录之后的想法(2):原来还有更简单的,奥
可以说上一节的双指针法,也可以说是相向指针法;比较着前进;
class Solution {
public:
vector sortedSquares(vector& nums) {
//计算数组大小;
int size=nums.size();
//新数组排序参数
int k=size-1;
//创建一个新的数组容器去接受比较完成之后的结果
vector newnums(size,0);
//前后双指针进行行遍历每一个数据
for(int i=0,j=size-1;i<=j;)
{
if(nums[i]*nums[i]<=nums[j]*nums[j])
{
//newnums[k]赋值后k--
newnums[k--]=nums[j]*nums[j];
//j--
j--;
}
else
{
//newnums[k]赋值后k--
newnums[k--]=nums[i]*nums[i];
//i++
i++;
}
}
return newnums;
}
};
自己实现过程中遇到哪些困难:for循环条件改变,写的不对, for(int i=0,j=size-1;i<=j;),++后置
视频讲解:双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目建议:本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。
看到题目的第一思路:
文章讲解:代码随想录
class Solution {
public:
int minSubArrayLen(int target, vector& nums) {
//设置最后结果--宏定义
int result=INT32_MAX;
//设置一个子序列长度;
int len=0;
//和
int sum=0;
for(int i=0;i=target)
{
len=j-i+1;//输出子长度
//长度判断
result=result
虽为暴力解法,仍然出错不少啊,在第二个循环中,
看完代码随想录之后的想法:确实简单了不少
class Solution {
public:
int minSubArrayLen(int target, vector& nums) {
//设置最后结果--宏定义
int result=INT32_MAX;
//设置一个子序列长度;
int len=0;
//和
int sum=0;
int i=0;
//滑动窗口--其实也是双指针进行配合
for(int j=0;j=target)
{
len=j-i+1;
result=result
自己实现过程中遇到哪些困难:while循环重点----sum会一直--双向判断,既判断加的sum,也判断减的sum;
sum-=nums[i++];--结合while循环想;
视频讲解:拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili
76.最小覆盖子串
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目建议:本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。
文章链接:代码随想录
看到题目的第一思路:无
看完代码随想录之后的想法:奥,判断边界条件,别忘了奇数最中间的情况
class Solution {
public:
vector> generateMatrix(int n) {
//首先可知n×n矩阵,进行顺时针的旋转;需要找好边界。设置二维数组
vector> res(n,vector(n,0));
//记录每一圈开始位置[0][0];[1][1];[2][2];
int startx=0;int starty=0;
//设计循环次数
int loop=n/2;//int向下取整;并且可知
//边界条件,每次要-1;
int offside=1;
//数组赋值时,循环条件
int i,j;
//依次累加
int count=1;
//while循环判断,别忘了奇数中间位置赋值
while(loop--)
{
i=startx;j=starty;//设置在for循环外侧--保持数据可用
for(j=starty;jstarty;j--) //下
{
res[i][j]=count++;
}
for(;i>startx;i--) //左
{
res[i][j]=count++;
}
startx++;
starty++;
offside++;//offside+=1;
}
//奇数中间位置赋值计算
if(n%2)
{
res[startx][starty]=count;
}
return res;
}
};
自己实现过程中遇到哪些困难:
视频链接:一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili
类似题目:54螺旋矩阵
54.螺旋矩阵
文章讲解:代码随想录
今日收获,记录一下自己的学习时长: