• 代码随想录算法训练营15期 Day 2 | 977.有序数组的平方 、209.长度最小的子数组 、59.螺旋矩阵II 、总结


    977.有序数组的平方 

    题目建议: 本题关键在于理解双指针思想 

    题目链接:力扣

    思路一:暴力解算,直接将所有元素变成一个平方,然后进行排序。

    1. class Solution {
    2. public:
    3. vector<int> sortedSquares(vector<int>& nums) {
    4. for(int i = 0;isize();i++)
    5. {
    6. nums[i]=nums[i]*nums[i];
    7. }
    8. sort(nums.begin(),nums.end());
    9. return nums;
    10. }
    11. };

    思路二:双指针法,首先声明一个数组与原始的数组大小相同,然后由两头的指针由大到小进行排序。

    1. class Solution {
    2. public:
    3. vector<int> sortedSquares(vector<int>& nums) {
    4. //首先声明一个数组长度与原始的大小相同
    5. vector<int> nums1(nums.size(),0);
    6. //提供数组的长度,为以后使用提供便利
    7. int k = nums.size()-1;
    8. for(int i = 0,j=nums.size()-1;i<=j;)
    9. {
    10. if(nums[i]*nums[i]
    11. {
    12. nums1[k--]=nums[j]*nums[j];
    13. j--;
    14. }
    15. else
    16. {
    17. nums1[k--]=nums[i]*nums[i];
    18. i++;
    19. }
    20. }
    21. return nums1;
    22. }
    23. };

     209.长度最小的子数组

    题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。  拓展题目可以先不做。

    题目链接:力扣 

    思路一:直接暴力计算,时间很长,不建议。
    思路二:双指针法,使用两个指针将中间的数组提取出来。
    双指针一般是使用一个for循环做了两个for循环的事情。

    起始位置使用i表示,终止位置使用j表示。起始位置与终止位置之间的差距大于等于s,则进行改变。

    1. class Solution {
    2. public:
    3. int minSubArrayLen(int target, vector<int>& nums) {
    4. int result = INT32_MAX;//声明最大的长度
    5. int i = 0;//起始位置
    6. int sum = 0;//和
    7. int length = INT32_MAX;//长度
    8. for(int j = 0;jsize();j++)//终止位置
    9. {
    10. sum+=nums[j];
    11. while(sum>=target)//注意是while
    12. {
    13. length = j - i + 1;
    14. sum = sum-nums[i];
    15. i++;//起始位置向前移动
    16. result = result < length ? result : length;
    17. }
    18. }
    19. return result0;
    20. }
    21. };

    59.螺旋矩阵II

    题目建议:  本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。

    题目链接:力扣

    关键在于四个边界的条件处理,一入循环深似海。注意循环不变量,坚持一个规则处理每一个边,按照左闭右开的规则。

    由于一圈等于两行两列,因此,转动的是n/2圈。需要判断转动的圈数是奇数还是偶数。左闭右开,终止位置是不包含的。

    1. class Solution {
    2. public:
    3. vectorint>> generateMatrix(int n) {
    4. //起始位置
    5. int startx = 0;
    6. int starty = 0;
    7. //偏移量
    8. int offset = 1;
    9. //声明一个二维数组
    10. vectorint>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
    11. //加入的数字
    12. int count = 1;
    13. //转动圈数
    14. int circle = n/2;
    15. while(circle--)//转动的圈数
    16. {
    17. int i,j;
    18. for( j = starty;j//第一行
    19. {
    20. res[startx][j]=count++;
    21. }
    22. for( i = startx;i//右侧第一列
    23. {
    24. res[i][j]=count++;
    25. }
    26. for(;j>starty;j--)//下侧第一列
    27. {
    28. res[i][j]=count++;
    29. }
    30. for(;i>startx;i--)
    31. {
    32. res[i][j]=count++;
    33. }
    34. startx++;
    35. starty++;
    36. offset++;
    37. }
    38. if(n%2 == 1)
    39. {
    40. res[n/2][n/2]=n*n;
    41. }
    42. return res;
    43. }
    44. };

     

  • 相关阅读:
    SpringBoot原理篇(2)—自定义starter
    在Python中匿名函数怎么用?
    网工内推 | 深圳网工专场,上市公司、国企,安全认证优先
    一个配线光交的网络覆盖能力有多大?
    Vue2--11种组件通信、Vue2处理响应式数据
    【C语言】函数传参与指针理解
    Kubernetes亲和性学习笔记
    ARM Cortex-M0 内核寄存器组
    思维,序列和
    共创可持续出行未来 奔驰牵手《阿凡达:水之道》
  • 原文地址:https://blog.csdn.net/m0_47489229/article/details/130859580