[2]-代码随想录算法训练营-day2-数组-part2

发布时间 2023-08-30 01:04:34作者: 缪白(Miubai)

代码随想录算法训练营第二天|数组-part2

1.LeetCode 997.有序数组的平方

  1. 题目

  2. 思路

    • 先给原始数组每个数进行平方
    • 然后用sort函数进行排序
  3. 刷随想录后想法

    • 双指针解法,降低时间复杂度为O(n)
    • 题目“非递减数列”,最大的数平方后在两头
    • 双指针选最大,然后选次大
    • 随想录重新开辟了一个result数组存放有序的数组,增加了空间消耗
    • 是否存在不用开辟空间的双指针解法?
  4. 实现困难

    • C++的vector<int>& nums
    • vector用法
    • 编程过程发现,双指针+开辟新数组的方式确实属于我能想到的最优解
    • for循环的判断条件以及递增条件模棱两可
    • 下标忘记-1
    • 关于平方的处理
  5. 实现代码

    • 刷随想录前的代码(暴力),时间复杂度为`O(nlogn)
    class Solution {
    public:
        vector<int> sortedSquares(vector<int>& nums) {
            for(int i =0; i<nums.size(); i++){
                //平方
                nums[i] = nums[i] * nums[i];
            }
            sort(nums.begin(), nums.end()); //递增序列
        return nums;
        }
    };
    
    • 双指针思想
    class Solution {
    public:
        vector<int> sortedSquares(vector<int>& nums) {
            int j = nums.size()-1;
            int i = 0;
            vector<int>result(nums.size());
            for(int k= nums.size()-1;  k >= 0; k--){
                if((nums[i]*nums[i]) >= (nums[j]*nums[j])){
                    result[k] = nums[i]*nums[i];    //最大的放最后面
                    i++;
                }else{
                    result[k] = nums[j]*nums[j];
                    j--;
                }
            }
        return result;
        }
    };
    

    双指针,这里稍稍修改一下Carl哥的代码,这里以K为迭代,便于理解。
    image-20230811004814562

  6. 学习收获

    • vector使用
    • 双指针思想

2.LeetCode 209 长度最小的子数组

  1. 题目

  2. 思路

    • 先确定一个最短的连续子数组,其和大于等于target
    • 记录其长度
    • 后移,再确定一个子数组,以此类推。
    • 返回最短位置
  3. 刷随想录后想法

    • 刷完随想录才知道题目什么意思
    • 双指针,滑动窗口思想,就是减少不必要的计算,因此节省了时间算法负责度
  4. 实现困难

    • 题没读懂,导致理解偏差
  5. 实现代码

    class Solution {
    public:
        int minSubArrayLen(int target, vector<int>& nums) {
            int start = 0;
            int result = -1;  //初始化距离,999表示无穷大
            int sum = 0;
            for(int end=0; end < nums.size(); end++){
                sum += nums[end];
                while(sum >= target){
                    if(sum >= target){  //如果找到了一个sum>=target,后移start,再看子数组是否也
                        if(result != - 1){
                            result = min(result, end-start+1);  //找最小的更新
                            sum -= nums[start];
                            start++;
                        }else{
                            result = end-start+1;
                        }
                    }
                }
            }
            if(result == -1){
                return 0;
            }
            return result;
        }
    };
    
  6. 学习收获

    • 审题认真,仔细分析
    • 双指针思想

3.LeetCode 59 螺旋矩阵II

  1. 题目

  2. 思路

    • 刷随想录前解题思路

      以行列变换为基础,填充

    • 随想录解题
      以圈数为基础,循环不变量

    • 如图

    image-20230813085005270

  3. 刷随想录后想法

    • 循环不变量思想
  4. 实现困难

  • 圈数确定
  • 边界值处理
  • LeetCode提交报错:下标越界等等
  1. 实现代码
  • 代码暂未实现,报错越界,暂不知原因
 class Solution {
 public:
     vector<vector<int>> generateMatrix(int n) {
         // vector< vector<int> >matrix(n, vector<int>(n));  //n*n
         vector<vector<int>> matrix(n, vector<int>(n));
         int startRow,startColumn = 0;
         int count = 1;
         int round = 1;
         int row, column = 0;
         while(round <= (n/2) ){
             //n/2圈
             for(column = startColumn; column < n-round; column++){
                 matrix[startRow][column] = count;
                 count++;
             }

                   for(row = startRow; row < n-round; row++){
                 matrix[row][column] = count;
                 count++;
             }

                               for(column; column > round-1; column--){
                 matrix[row][column] = count;
                 count++;
             }

                               for(row; row > round-1; row--){
                 matrix[row][column] = count;
                 count++;
             }

                   //对角线,内缩一圈
             startColumn++;
             startRow++;
             round++;
         }
         if(n%2 != 0){
             matrix[startRow][startColumn] = count;
         }

               return matrix;
     }
 };
  1. 学习收获
    • 循环不变量思想