代码随想录day2|977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵

977.有序数组的平方

第一遍思路

在看到要求时间复杂度为o(n)时,想到只能对整个数组进行一次遍历,不能直接使用排序算法,因此不能先排序再平方。从双指针法的角度进行考虑,这道题也就迎刃而解了。

点击查看代码
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int left=0;
        int right=nums.size()-1;
        vector<int> result;
        while(left<=right){
            if(abs(nums[left])<=abs(nums[right])){
                result.push_back(nums[right]*nums[right]);
                right--;
            }
            else{
                result.push_back(nums[left]*nums[left]);
                left++;
            }
        }
        reverse(result.begin(),result.end());
        return result;

    }
};

思路总结

这道题还是比较简单的。面对数组问题时,在没有思路时,我们可以试着从方法的角度来进行考虑,一看到数组题就要想到数组常用的方法,在从中选要用的方法。总之,多练习多思考才能熟练。

209.长度最小的子数组

第一遍思路

对于数组我想到用两个指针去控制,当总和大于等于target时,左指针前移,否则,右指针前移。我的想法是终结条件为左指针小于数组长度,用while循环控制两个指针来循环。

实现问题

实现过程中发现右指针小于最大值和等于最大值时是两种情况,因此多加了一个判断。

点击查看代码
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result=0;//结果
        int left=0;//左边界
        int right=0;//右边界
        int sum=nums[0];//窗口内的总和
        while(left<=nums.size()-1){
            if(right<nums.size()-1){//当右边界没有到达最大值时
                if(sum<target){
                    sum=sum+nums[right+1];
                    right++;
                }
                else if(sum>=target){
                    if(result==0){
                        result=right-left+1;
                    }
                    else{
                        result=result<(right-left+1)?result:(right-left+1);
                    }
                    sum=sum-nums[left];
                    left++;
                }
            }
            else{//当右边界到达最大值时
                if(sum>=target){
                     if(result==0){
                        result=right-left+1;
                    }
                    else{
                        result=result<(right-left+1)?result:(right-left+1);
                    }
                    sum=sum-nums[left];
                }
                 left++;    

            }

        }
        return result;
    }
};

题后总结

  • 在滑动窗口中,用for循环来控制右指针可以比while循环更加简化
  • 可以将result设置为length+1或者设为INT32_MAX比将result设为0更加简化。

59.螺旋矩阵

第一思路

想了半小时什么也想不出来,不知道怎么下手。。。

实现问题

。。。附上看完思路后的代码

点击查看代码
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n,vector<int>(n,0));
        int startx=0,starty=0;
        int loop=1;
        int mid=n/2;
        int i,j;
        int count=1;
        while(loop<=n/2){
            i=startx;
            j=starty;

            for(;j<n-loop;j++){
                result[i][j]=count++;
            }
            for(;i<n-loop;i++){
                result[i][j]=count++;
            }
            for(;j>starty;j--){
                result[i][j]=count++;
            }
            for(;i>startx;i--){
                result[i][j]=count++;
            }
            loop++;
            startx++;
            starty++;
        }
        if(n%2){
            result[mid][mid]=count;
        }
        return result;
    }
};

题后总结

这个题最大的难度在于不知道如何把问题分成步骤进行循环。对于计算机来说,最擅长的事情就是遍历,要在此基础上进行思考。

posted @   缩地  阅读(162)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示