代码随想录算法训练营第二天刷题记录|Leetcode 977 有序数组的平方、Leetcode 209长度最小的子数组、Leetcode 59螺旋矩阵

# Leetcode 977 有序数组的平方#

题目链接:有序数组的平方

解题思路:本题仍是使用双指针法,不过这次使用三个指针。由于元数组是递增的,两端的符号可能不同,则仅需在两端方两个指针,分别计算平方,较大者放入目标数组,然后该指针向里移动,以此类推。这一题原始想法是找到中间符号的分界点,然后分成两块再使用类似双指针的方法,但比较麻烦,不如直接从两端开始。一下投放代码:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int i=0,j=nums.size()-1;
        vector<int> res(nums.size(),0);
        int k = nums.size()-1;
        while(i<=j)
        {
            if(nums[i] * nums[i] < nums[j]* nums[j])
                res[k--] = nums[j] * nums[j--];
            else 
                res[k--] = nums[i] * nums[i++];
        }
        return res;
    }
};

#Leetcode209 最小长度子数组#

 题目:最小长度子数组

方法:滑动窗口

即两个指针,分别移动,在里面去找到一个最小的符合题意的数组的长度。

注意:for(int j = 0;j<n;j++)中的j是终止位置!!

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int res = nums.size()+1,sum= 0;
        int left=0,right = 0,len = nums.size();
        for(;right<len;right++){
            sum+=nums[right];
            while(sum>=target){
                sum-=nums[left];
                int lenth = right - left + 1;
                res = res>lenth?lenth:res;
                left++;
            }
            
        }
        if(res <= len)
            return res;
        else
            return 0;
    }
};

#Leetcode 59 螺旋数组#

题目:螺旋数组

本题就强调一点:循环代码中要保证变量一致性!是的逻辑可复制

本题更考验基本功,在敲代码是要胆大心细!

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int rol = 0,col = 0;
        int offset = 1,count = 1;
        int loop = n/ 2;
        int i,j;
        vector<vector<int>> nums(n,vector<int>(n,0));
        while(loop--){
            i = rol;
            j = col;
            for(j = col;j<n-offset;j++)
                nums[rol][j] = count++;
            for(i = rol;i<n-offset;i++)
                nums[i][j] = count++;
            for(;j>col;j--)
                nums[i][j] = count++;
            for(;i>rol;i--)
                nums[i][j] = count++;
            rol++;
            col++;
            offset++;


        }
        if(n %2 != 0)
            nums[n/2][n/2] = count;
        return nums;
    }
};

本题还有变种,我在南大数据结构课堂竞赛中所遇到,比本题更为麻烦一点。明日将那一题和数组部分的总结一并写出来,太晚了,睡觉!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值