首页 > 其他分享 >代码随想录训练营第二天 | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

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

时间:2024-05-10 14:13:17浏览次数:10  
标签:977 https nums int 复杂度 随想录 vector 数组 size

977.有序数组的平方

题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
文章讲解:https://programmercarl.com/0977.有序数组的平方.html
视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep

暴力解

  • 时间复杂度 O(nlogn)
  • 空间复杂度 O(1)

双指针法

  • 时间复杂度 O(n)
  • 空间复杂度 O(n)
    tips
// 暴力解
#if 0
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for(auto it = nums.begin(); it != nums.end(); ++it) *it = (*it) * (*it);
        sort(nums.begin(), nums.end());
        return nums;
    }
};
#else
// 双指针
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> ans(nums.size());
        int idx = nums.size() - 1;
        int left = 0, right = nums.size() - 1;
        while (left <= right) {
            if(nums[left] * nums[left] < nums[right] * nums[right]) {
                ans[idx--] = nums[right] * nums[right];
                right--;
            } else {
                ans[idx--] = nums[left] * nums[left];
                left++;
            }
        }
        return ans;
    }
};

#endif

209.长度最小子数组

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
文章讲解:https://programmercarl.com/0209.长度最小的子数组.html
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE

滑动窗口

难点:虽然知道用滑动窗口来解,但是如何确定窗口的边界却花了比较多的时间
tips: 对于滑动窗口问题无非就是不满足条件的时候增加窗口,满足条件时缩减窗口

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int left = 0, right = 0;
        int min_len = INT_MAX;
        int size = nums.size();
       
        int count = 0; // 窗口内所有数的和
        while(right < size) {
            
            count += nums[right];
            // 满足条件时缩减窗口
            while(count >= target && left <= right) {
                if(right - left + 1 < min_len) min_len = (right - left + 1);
                count -= nums[left];
                ++left;
            }
            // 不满足条件时不断增大窗口
            ++right;         
        }
        return min_len == INT_MAX ? 0 : min_len;
    }
};

59.螺旋矩阵II

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
文章讲解:https://programmercarl.com/0059.螺旋矩阵II.html
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/
难点:主要是边界问题

  • 时间复杂度 o(n2)
  • 空间复杂度 o(n2)
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int row_begin = 0, row_end = n - 1;
        int col_begin = 0, col_end = n - 1;
        int elem = 1;
        // 初始化二维数组
        vector<vector<int>> ans;
        ans.resize(n);
        for(int num = 0; num < n; ++num) ans[num].resize(n);
        int size = ans.size() * ans[0].size();
        // 使用元素个数来控制循环次数
        while (elem <= size) {
            for(int i = col_begin; i <= col_end && elem <= size; ++i) ans[row_begin][i] = elem++;
            ++row_begin;
            for(int j = row_begin; j <= row_end && elem <= size; ++j) ans[j][col_end] = elem++;
            --col_end;
            for(int k = col_end; k >= col_begin && elem <= size; --k) ans[row_end][k] = elem++;
            --row_end;
            for(int l = row_end; l >= row_begin && elem <= size; --l) ans[l][col_begin] = elem++;
            ++col_begin;
        }
        return ans;     
    }
};

标签:977,https,nums,int,复杂度,随想录,vector,数组,size
From: https://www.cnblogs.com/cscpp/p/18184185

相关文章

  • 2024-05-10 js 常用数组方法
    push():向数组的末尾添加一个或多个元素,并返回新的长度。pop():删除并返回数组的最后一个元素。shift():删除并返回数组的第一个元素。unshift():向数组的开头添加一个或多个元素,并返回新的长度。splice():通过删除或替换现有元素或者添加新元素来修改数组,并以数组形式返回被修改......
  • 代码随想录算法训练营第第二天 | 977.有序数组的平方 、27. 移除元素
    977.有序数组的平方题目建议:本题关键在于理解双指针思想题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/文章讲解:https://programmercarl.com/0977.有序数组的平方.html视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep/***@param{number[]}nu......
  • 53_Maximum Subarray-最大子数组
    问题描述Givenanintegerarray nums,findthe subarray withthelargestsum,andreturn itssum.给定一个数组nums,找到一个子数组。使它的和最大,返回子数组例子Input:nums=[-2,1,-3,4,-1,2,1,-5,4]Output:6Explanation:子数组[4,-1,2,1]有最大的和6.基......
  • 215. 数组中的第K个最大元素
    给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。你必须设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:[3,2,1,5,6,4],k=2输出:5示例2:输入:[3,2,3,1,2,4,5,5,6......
  • C++ 数组元素操作
    数组元素的移除核心思路:创建一个新的内存空间存储移除后的数组,再将原数组delete释放,再将指针指向新数组。cout<<"-----------------------------数组元素的移除-------------------------"<<endl;//cout<<deleteArrByIndex(0,arr11)<<endl;//示例数组int*p......
  • 【每日一题】寻找两个正序数组的中位数
    4.寻找两个正序数组的中位数给定两个大小分别为m和n的正序(从小到大)数组 nums1和 nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log(m+n))。示例1:输入:nums1=[1,3],nums2=[2]输出:2.00000解释:合并数组=[1,2,3],中位数2示例......
  • 33. 搜索旋转排序数组
    整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2,4,5,6,7]在下标3处经......
  • 153. 寻找旋转排序数组中的最小值
    已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,2,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4,5,6,7,0,1,2]若旋转7次,则可以得到[0,1,2,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a[n-1]]旋转一次的结果......
  • 代码随想录算法训练营第第一天 | 704. 二分查找 、27. 移除元素
    704、二分查找题目链接:https://leetcode.cn/problems/binary-search/文章讲解:https://programmercarl.com/0704.二分查找.html视频讲解:https://www.bilibili.com/video/BV1fA4y1o715`varsearch=function(nums,target){letleft=0;letright=nums.length;letmi......
  • 34. 在排序数组中查找元素的第一个和最后一个位置
    给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你必须设计并实现时间复杂度为O(logn)的算法解决此问题。示例1:输入:nums=[5,7,7,8,8,10],target=8......