977.有序数组的平方
-
文章链接,视频链接
-
自己看到题目的第一想法
思路:双指针法->最大的元素一定在两边->比较出最大的元素后放入新数组->依次比较原数组中的每个元素->新数组的元素从大到小排列->翻转数组
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> newnums;
int slow=0;
int fast=nums.size()-1;
while(slow<=fast)
{
if(nums[slow]*nums[slow]<nums[fast]*nums[fast])
{
newnums.push_back(nums[fast]*nums[fast]);
fast--;
}
else
{
newnums.push_back(nums[slow]*nums[slow]);
slow++;
}
}
reverse(newnums.begin(),newnums.end());
return newnums;
}
};//自己写的
-
看完代码随想录之后的想法
评价一下自己上边写的,完全就属于没必要,脱裤子放屁了属于是。既然都用reverse了那还不如直接用sort更省事儿。应该创建一个和原来数组大小相同的新数组,新数组每个位置的值单独确定。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> result(nums.size(),0);
int k=nums.size()-1; //k为新数组的下标
for(int i=0,j=nums.size()-1;i<=j;)
{
if(nums[i]*nums[i]<nums[j]*nums[j])
{
result[k]=nums[j]*nums[j];
k--;
j--;
}
else
{
result[k]=nums[i]*nums[i];
k--;
i++;
}
}
return result;
}
};//新写法
-
自己实现过程中遇到哪些困难
对vector中的一些函数还是不熟悉,写代码有点啰嗦。
-
今日收获,记录一下自己的学习时长
心得:想起来用双指针法了,在存入新数组时想的过于简单了,对新数组中的每个值所对应的位置还是不明确,一股脑的存进去了。
209.长度最小的子数组
-
文章链接,视频链接
-
自己看到题目的第一想法
思路:一开始想用暴力算法,后来想着太麻烦了,看来卡哥的双指针思路,终于能写出来了。
双指针法->数组元素和大于等于目标值->计算当前长度->前指针向后移动->再次计算是否大于等于 目标值->更新长度->后指针向后移动->后指针遍历完最后一个元素输出最小长度。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum=0;
int i=0;
int len=INT_MAX;
for(int j=0;j<nums.size();j++)
{
sum+=nums[j];
while(sum>=target)
{
if(j-i+1<len) len=j-i+1;
sum=sum-nums[i];
i++;
}
}
return len==INT_MAX? 0:len;
}
};//看完视频思路写的
-
看完代码随想录之后的想法
时间复杂度这个东西没太学明白,还得再看看,总的来说就是把两个for循环简化成一个for循环,j代表的是终止位置。
59.螺旋矩阵II
-
文章链接,视频链接
-
自己看到题目的第一想法
思路:模拟螺旋矩阵遍历->确定循环次数->确定每条边的起始和终止位置->对二维数组中每个位置进行赋值->输出数组
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n,vector<int>(n));
int number=1;
int a=0;
int i,j;
int loop=n/2;
while(loop--)
{
for(int i=a,j=a;j<n-a-1;j++)
{
result[i][j]=number++;
}
for(int i=a,j=n-a-1;i<n-a-1;i++)
{
result[i][j]=number++;
}
for(int i=n-a-1,j=n-a-1;j>a;j--)
{
result[i][j]=number++;
}
for(int i=n-a-1,j=a;i>a;i--)
{
result[i][j]=number++;
}
a++;
}
if(n%2==1)
{
result[n/2][n/2]=n*n;
}
return result;
}
};//自己写的
-
看完代码随想录之后的想法
评价一下自己上边写的,一看就是稀里糊涂凑出来的,脑子是乱的,每个变量的含义也不具体。在算头尾的时候不知道拿什么变量来限制,一凑发现行就用了,这个以后要注意,看完视频后修改的代码如下:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n,vector<int>(n));
int startx=0; //每次开始的坐标
int starty=0;
int count=1;
int offset=1; //每条边限制
int loop=n/2; //循环次数
while(loop--)
{
int i=startx;
int j=starty;
for(;j<n-offset;j++)
{
result[i][j]=count++;
}
for(;i<n-offset;i++)
{
result[i][j]=count++;
}
for(;j>starty;j--)
{
result[i][j]=count++;
}
for(;i>starty;i--)
{
result[i][j]=count++;
}
startx++;
starty++;
offset++;
}
if(n%2==1)
{
result[n/2][n/2]=count;
}
return result;
}
};
-
自己实现过程中遇到哪些困难
变量太多容易乱了,不清楚每个变量调节的是啥,稀里糊涂一顿搞。while循环中不要出现固定的值。
-
今日收获,记录一下自己的学习时长
一些细节问题,比如构造一个二维数组,或者取一个最大值,这种还得自己多积累。