代码随想录算法训练营第二天

今天回家早,但是刚到家刷视频一直到10点多,洗漱完都11点,写完几个代码题都感到12点了,可想而知明天上班又会犯困,以后先把题写了剩下时间在玩吧

LEETCODE 977. 有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

解答代码

class Solution 
{
public:
    vector<int> sortedSquares(vector<int>& nums) 
    {
        int left = 0;
        int right = nums.size() - 1;
        vector<int> result(nums.size(),0);
        for(int i = nums.size() - 1; i >= 0; i--)
        {
            if(nums[left]*nums[left] > nums[right]*nums[right])
            {
                result[i] = nums[left]*nums[left];
                left++;
            }
            else if(nums[right]*nums[right] >= nums[left]*nums[left])
            {
                result[i] = nums[right]*nums[right];
                right--;
            }

        }
        return result;
    }
};

注意大小顺序,是result是从小到大,但是双指针是指向平方和最大的那个,需要注意一下。

另外注意vector的创建规则,别写错了

209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 

子数组

 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

错误代码:

class Solution
 {
public:
    int minSubArrayLen(int target, vector<int>& nums) 
    {
        int slow = 0;

        int add = 0;
        int ans = INT32_MAX;

        for(int fast = 0;fast < nums.size() ;fast++)
        {
            add += nums[fast];
            while(add >= target)//出现大的了使用滑动窗口,用while不断缩小窗口的值
            {
                add -= nums[slow];
                slow++;
                ans = min(ans,fast - slow + 1);//使用完fast遍历数组后取最小的那个ans

            }//这里有问题,fast-slow+1的判断太靠后了
        }
        return ans = max(0,ans);

    }
};

在while循环中对fast-slow+1的判断不应该在slow变动之后进行。另外return也出错了,需要判断ans是否为0(即整个数组的和也不满足),而不是简单的和0比

正确答案:

class Solution
 {
public:
    int minSubArrayLen(int target, vector<int>& nums) 
    {
        int slow = 0;

        int add = 0;
        int ans = INT32_MAX;

        for(int fast = 0;fast < nums.size() ;fast++)
        {
            add += nums[fast];
            while(add >= target)//出现大的了使用滑动窗口,用while不断缩小窗口的值
            {
                int a = fast - slow + 1;
                add -= nums[slow];
                slow++;
                ans = min(ans,a);//使用完fast遍历数组后取最小的那个ans

            }
        }
        return ans == INT32_MAX ? 0 : ans;

    }
};

59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

基本思想,先把数填到二维数组中,在按行输出;

错误代码

class Solution 
{
public:
    vector<vector<int>> generateMatrix(int n) 
    {
        int inner = 1;
        vector<vector<int>> arry(n,vector<int>(n,0));
        int i = 0, j = 0;
        int loop = n/2;
        int length = n - 1;
        int back = 0;
        while(loop--)
        {
            for(;j < length; j++)
            {
                arry[i][j] = inner++;
            }
            for(;i < length; i++)
            {
                arry[i][j] = inner++;
            }
            for(;j > back ; j--)
            {
                arry[i][j] = inner++;
            }
            for(; i > back ;i--)
            {
                arry[i][j] = inner++;
            }
            length--;
            back++;




        }
        if(n%2 != 0)//这里需要单独拿出去给最中间赋值,并且要判断n是不是偶数,
        {
            arry[n/2][n/2] = inner;
        }

        return arry;
    }
};

对i,j的判断太冗余了,除了左闭右开,还需要考虑每次循环的初始位置

正确代码:

使用go判断ij增大,用back判断ij减少,loop判断循环次数,start控制初始位置,

注意第一个for中不能写成i,j = start,cpp语言只会给j赋值,这样会导致错误,应该是底层逻辑的问题

class Solution 
{
public:
    vector<vector<int>> generateMatrix(int n) 
    {
        int inner = 1;
        vector<vector<int>> arry(n,vector<int>(n,0));
        int i = 0, j = 0;
        int loop = n/2;
        int start = 0;
        int go = n-1;
        int back = 0;
        while(loop--)
        {
            for(i = start,j = start;j < go ; j++)
            {
                arry[i][j] = inner++;
            }
            for(;i < go; i++)
            {
                arry[i][j] = inner++;
            }
            for(;j > back ; j--)
            {
                arry[i][j] = inner++;
            }
            for(; i > back ;i--)
            {
                arry[i][j] = inner++;
            }
            start++;
            go--;
            back++;



        }
        if(n%2 != 0)//这里需要单独拿出去给最中间赋值,并且要判断n是不是偶数,
        {
            arry[n/2][n/2] = inner;
        }

        return arry;
    }
};

 发现了一个变量更少的写法,并且好像使用while循环比使用for循环消耗的时间更少

class Solution 
{
public:
    vector<vector<int>> generateMatrix(int n) 
    {
        vector<vector<int>> arr(n,vector<int>(n,0));
        int offset = 0;//只用一个offset可以不用写很多其他的变量
        int value = 1;
        int i = 0,j = 0;
        while(value < n*n)
        {
            for(j = offset,i = offset; j < n - 1 - offset; j++)
            {
                arr[i][j] = value++;
            }
            for(; i < n - 1 - offset; i++)
            {
                arr[i][j] = value++;
            }
            for(i = n - 1 - offset, j = n -1 - offset; j > offset; j--)
            {
                arr[i][j] = value++;
            }           
            for(; i > offset; i--)
            {
                arr[i][j] = value++;
            }
            offset++;
        }
        if(n%2 == 1)
        {
            arr[n/2][n/2] = value;
        }
        return arr;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值