LeetCode977.有序数组的平方

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

暴力解法:

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

思路:最开始看到这个题的时候,第一反应就是先把每个元素平方,再用一个sort函数进行排序。

小结:该解法利用了sort函数,相比起自己写排序函数更为简单,但时间复杂度比双指针法高,应该是比较容易想到的解法。

双指针法:

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

时间复杂度:O(n)

思路: 该解法用i作为起始位置下标,j作为终止位置的下标,以i、j为下标的nums构成快指针;然后设定一个新的数组vec作为慢指针。因原数组为非递减顺序排序且存在负数,故平方后一定是两边的元素大于中间的元素。因此只需比较两边平方后的元素谁大,再将元素存入新数组中即可。直至i > j后,比较结束,得出经过排序的数组。

小结:该解法比较巧妙的地方是只需要经过一次遍历便可以得出平方排序后的数组,实质上并没有改变原数组的元素,而是将元素平方后存入新数组中;平方运算和排序同时进行,从而降低了时间复杂度。

LeetCode209.长度最小的子数组

题目链接:LeetCode209.长度最小的子数组

滑动窗口:

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

时间复杂度:O(n)

思路:设定数组起始位置和终止位置,利用for循环使数组终止位置改变(后移),以达到实现sum >= target的目标;并把数组长度存入ans中。后改变数组初始位置(后移),再使终止位置后移,从而实现滑动窗口;当数组再次实现sum >= target时,计算出长度并比较,最终得出最小长度的连续数组。

小结:一开始写的时候忽略了连续数组这个条件,便简单地用了排序和累加。后面发现之后用了暴力解法,结果就超时了,最后AC代码是用滑动窗口写的。几个注意要点:

1.滑动窗口的使用前提是连续数组。

2.在比较之前预先将最小长度设为无穷大(INT_MAX),方便寻找最小值。(寻找最大值时则初始化为无穷小(INT_MIN))。

3.计算长度时要注意(j - i)为数组下标的差,实际长度应该在此基础上加1。

4.明确起始位置和终止位置移动顺序以及中间步骤的顺序:移动终止位置 -> 达到sum >= target -> 计算数组长度 -> 比较出数组长度的最小值 -> 移动起始位置(sum减去该连续数组的起始元素)

5.滑动窗口本质上还是双指针的应用,改变起始和终止,而不改变中间值。

LeetCode59.螺旋矩阵II

题目链接:LeetCode59.螺旋矩阵II

class Solution {
public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> vec(n, vector<int>(n, 0));int startx = 0,starty = 0;int loop = n/2;int mid = n/2;int count = 1;int offset = 1;int i = 0,j = 0;while(loop--){i = startx;j = starty;for(j = starty;j < n - offset;j++){vec[startx][j] = count++;}for(i = startx;i < n - offset;i++){vec[i][j] = count++;}for(;j > starty;j--){vec[i][j] = count++;}for(;i > startx;i--){vec[i][j] = count++;}startx ++;starty ++;offset ++;}if(n%2){vec[mid][mid] = count;}return vec;}
};

思路: 螺旋矩阵本质上还是一个二维数组,通过螺旋变化(递增),将值填入数组中。而填充为每一条边的遍历,经过4条边的遍历后,逐渐向内收缩从而实现将数组填充完成。

小结:几个关键变量及其作用:

1.startx,starty:定义了每次4边遍历的起始位置和终止位置,而不改变到变量所需要的i和j。

2.loop:4边遍历的圈数(当n为奇数时,中间值会没有被填充到,这时需要将最终值count填入中间位置)。

3.mid:作为数组下标的mid刚好对应n为奇数时的中间位置。

4.count:做为填充值,每次加一。

5.offset:在进行4边的遍历时需要对区间进行一致处理,此处用了左闭右开区间,而右开就会使每条边少一次填充,再进行完一轮4边遍历后将边界值加一来缩小数组所需填充的长度。

代码随想录算法训练营第二天|LeetCode977.有序数组的平方、LeetCode209.长度最小的子数组、LeetCode59.螺旋矩阵II。相关推荐

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

    代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II 一. LeetCode977.有序数组的平方 1. 题目链接[LeetCode9 ...

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

    --------------------------- 977.有序数组的平方 #include <iostream> #include <algorithm> #includ ...

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

    题目连接:977.有序数组的平方 暴力法:将数组所有元素平方然后再排序(未利用题目条件:原始数组按照非降序排列) 双指针法:数组中各元素符号有三种情况:①所有元素非负(将数组中元素平方即可).②所有元 ...

  4. 代码随想录算法训练营第二天|LeetCode977.有序数组的平方、LeetCode209.长度最小的子数组、LeetCode59.螺旋矩阵Ⅱ

    算法训练营打卡第二天,今天的前两道题目重点练习了双指针的用法,最后一道题目将边界条件的限定作为关键点,额外锻炼了逻辑能力. LeetCode977.有序数组的平方 题目链接 https://leetc ...

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

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

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

    目录: 977.有序数组的平方 209.长度最小的子数组 1.暴力输出法 2.滑动窗口法 59.螺旋矩阵II 总结: 今日收获: 977.有序数组的平方 因为是递增且有负数的数组,那么他们的平方如果还 ...

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

    977.有序数组的平方 力扣题目链接 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 示例 1: 输入:nums = [-4,-1, ...

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

    第一章数组 (今日任务) 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结 建议大家先独立做题,然后看视频讲解,然后看文章讲解,然后在重新做一遍题,把题目AC,最后整理 ...

  9. 977. 有序数组的平方|209. 长度最小的子数组|59. 螺旋矩阵 II

    977. 有序数组的平方 原理 准备:双指针.一个空数组.双指针指向的两个元素作比较,更大的数平方之后,放入空数组的尾部空位. 图解 其实这题的指针有两种方法: 从两边向中间靠拢,得到的是由大到小的值 ...

最新文章

  1. oracle迁移mysql_从自建Oracle迁移至RDS MySQL
  2. (JAVA)FileWriter
  3. LeetCode 2002. 两个回文子序列长度的最大乘积(状态压缩+枚举状态子集+预处理)
  4. python 安卓app开发环境搭建_基于react-native的APP开发环境配置
  5. 试分别简述udp和tcp的特点_技术帖:污水处理中曝气设备的分类及特点小结
  6. WebGrid Enterprise
  7. linux低级格式化工具下载,Hard Disk Low Level Format Tool下载-硬盘低级格式化工具 v2.37 官方版 - 下载吧...
  8. [裴礼文数学分析中的典型问题与方法习题参考解答]5.1.25
  9. 网络子系统33_网桥设备的配置更新
  10. win10蓝屏无法进入系统_WIN10系统进“吃鸡”蓝屏
  11. 72个炫酷的CSS技巧
  12. 画洗碗机器人的思维导图_赞!三年级小学生画出这样的思维导图
  13. 数据结构:手把手教你写代码系列总结与说明
  14. Pyqt设计界面时无法显示图片问题
  15. 电源输出电压纹波及电流纹波测试步骤
  16. isEmpty()和isNotEmpty()区别
  17. 使用python计算复利
  18. GHOST使用教程(图解)
  19. 阿里巴巴集团主席马云演讲实录(图)
  20. android 九宫格轨迹密码

热门文章

  1. 英语口语测试软件原理,英语口语自主训练原理及方法
  2. sensor binning信号及信噪比
  3. 新垣结衣自拍照_如何安全地进行自拍照(不会掉下悬崖或被汽车撞到)
  4. DSY1531*Bank notes
  5. Git(笔记三)---Git常用命令
  6. R语言使用fmsb包可视化基本雷达图(radar chart、蜘蛛图spider plot)、数据预处理(计算每个变量的最大值和最小值、并合并到原数据集)、可视化单个数据对象的雷达图
  7. Excel将任意数字替换为空白
  8. 分享卡通儿童中小学班干竞选PPT模板
  9. SSM电影院购票系统
  10. SQL 计算每个月的工作天数