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

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

  • 977.有序数组的平方
  • 209.长度最小的子数组
  • 59.螺旋矩阵II
  • 数的三次方根

今天做了三道题,用时一个半小时。晚上再找几道题补充一下。

977.有序数组的平方

题目链接:977.有序数组的平方
文章讲解
状态:知道要用双指针,但是没想到要在开一个数组,想到之后就ac出来了。

思路:有序数组,最大值一定在两侧,用双指针,再开一个数组储存。用while循环。

代码

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int size = nums.size();
        for (int i = 0; i < size; i++)
            nums[i] *= nums[i];

        vector<int> result(nums.size(),0);
        int j = size - 1;
        int k = size - 1;
        int i = 0;
        while (k >= 0)
        {
            if (nums[j] > nums[i])
            {
                result[k--] = nums[j];
                j--;
            }
            else
            {
                result[k--] = nums[i];
                i++;
            }
        }
        return result;
    }
};

209.长度最小的子数组

题目链接:209.长度最小的子数组
文章链接
状态:能明白滑动窗口的思想,但是用代码实现不出来

思想:画图画出来了,有时候一动笔就能想出来,用了一个while循环。以后多试试三目运算符。

代码

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int size = 0;
        int i = 0;
        int result = INT_MAX;
        int sum = 0;
        for (int j = 0; j < nums.size(); j++)
        {
            sum += nums[j];
            while (sum >= target)
            {
                size = j - i + 1;
                result = min(size,result);
                sum -= nums[i++];
            }
        }
        return min(result,size);
    }
};

59.螺旋矩阵II

题目链接:59.螺旋矩阵II
文章链接
状态:磕磕绊绊的能ac出来,用的时间有点长。

思路:首先要了解螺旋矩阵的性质,在填充时每一行要留出一位给下一位,所以要设置offset。loop来控制循环的圈数,还要注意奇数时中间位置数的填充,在转圈是要注意边界条件,不要越界。最后一圈过后起始坐标都要加一。

代码

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

            startX++;
            startY++;
            offset += 1;
        }
        if (n % 2) res[mid][mid] = count;
        return res;
    }
};

数的三次方根

题目链接:数的三次方根

思路:用二分法直接做,注意保留6位小数,根据经验应该循环到八位小数,替换区间边界时不用加一。
代码

#include 
#include 

using namespace std;

int main()
{
    double x;
    cin>>x;
    
    double l = -10000;
    double r = 10000;
    while (r - l > 1e-8)
    {
        double mid = (l + r) / 2;
        if (mid * mid * mid >= x) r = mid;
        else l = mid;
    }
    printf("%lf",l);
    return 0;
}

你可能感兴趣的:(算法,矩阵,c++)