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



    问题( 一 )

    问题描述:

    给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序

    题目链接: 


    问题分析:

    提示:给定的数组是按从小到大的顺序排列的,可能大家容易想到的就是暴力破解,所有数先平方,简单粗暴。再进行排序。这里给大家讲的是双指针的思路。

             例如给定的数组:   nums={ -4 , -3 , 1 , 2 , 4};  通过观察我们可以得出,平方之后两侧的数是最大的,所以双指针法,一个往右移动,一个向左移动,平方进行比较,大的存放到数组中,小的不移动,说明一点(这里我们放入数组的元素,是从尾部往前存放,这样得到得数组才是从小到大得顺序)。同时下面的代码中没有,对两个元素相等进行处理,为什么?1、 因为在实际处理的时候,遇到两个数相等的是比较少的    2、这样写的代码更简洁,可读性更高。

             视频讲解(代码随想录):


    解决方案:

    1. vector<int> sortedSquares(vector<int>& nums) {
    2. int left = 0 ;
    3. int right = nums.size()-1;
    4. vector< int> ret(right+1);
    5. int num=right;
    6. while( left < right ){
    7. if( nums[left]*nums[left] < nums[right]*nums[right] ){
    8. ret[num--]=nums[right]*nums[right];
    9. right--;
    10. }
    11. else { //大于等于的情况
    12. ret[num--]=nums[left]*nums[left];
    13. left++;
    14. }
    15. }
    16. ret[num]=nums[left]*nums[ left ];
    17. return ret;
    18. }

    问题(  二  ) 

    问题描述: 

    给定一个含有 n 个正整数的数组和一个正整数 target 。

    找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

    题目链接:

    问题分析:

              求符合条件的数组,就是一个滑动窗口,其实也是双指针,前后两个指针固定住一个窗口。两个指针都指向数组的第一个元素,定义一个计数器(计算元素的值),第一个指针往后移动遍历元素,当我们的计数速器大于或者等于给定的 target  时,此时这个区间就是我们要找的子数组,此时我们的第一个指针往后移动,不断的压缩我们的窗口,取符合的最小窗口。 

              视频讲解: 

    双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili

    解决方案:

    1. int minSubArrayLen(int target, vector<int>& nums) {
    2. int size=nums.size(); //记录子序列的长度
    3. int sum=0 ; //子序列的元素的大小
    4. int flag=0 ;
    5. int lenth=0 ;
    6. int i=0 ;
    7. for(int j=0 ; j< nums.size() ; j++){
    8. sum += nums[j];
    9. while( sum >=target ){
    10. lenth = j-i+1; //区间的长度
    11. size= size > lenth ? lenth : size;
    12. flag=1;
    13. sum-=nums[i];
    14. i++; //缩小区间长度
    15. }
    16. }
    17. return flag ==1 ?size : 0 ;
    18. }

    问题(  三  ) 

    问题描述:

     给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

    题目链接:

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

    问题分析:

             我们需要考虑转几圈,循环控制圈数。转圈的时候我们采用左闭右开的原则(大多数人可能会想不到这一点) 往左从零开始剩下一个元素没有处理,往下的时候就从剩下的这个元素开始,这样每处理一条边的时候,都会空出一个元素留给下一条边处理,转完一圈刚好全部点都处理完了,每次转圈的起始位置都在对角线的位置,此时我们还要考虑一个点如果圈速是奇数,说明中间是一个点,这里我们需要进行特殊处理。

    标注:  这里的 **line**用来更新我们每圈的起始位置,为什么要  n-line -1 ,因为每一条边的最后一个元素不出来,以及转完一圈后要缩小范围。

     解决方案:

    1. vectorint>> generateMatrix(int n) {
    2. int count=n/2 ; //要转的圈数
    3. int x=0,y=0;
    4. vectorint>> ret(n,vector<int>(n,0)); //形成的矩阵
    5. int value=1;
    6. int line=0; //记录边界
    7. while( count-- ){
    8. // ->
    9. for( x=line ; y < n-line-1 ; y++ ){
    10. ret[x][y] = value++;
    11. }
    12. //往下
    13. for( y=n-line-1 ; x < n-line-1 ; x++ ){
    14. ret[x][y]=value++;
    15. }
    16. //往左
    17. for( ; y > line ; y--){
    18. ret[x][y]=value++;
    19. }
    20. //往上
    21. for( ; x > line ; x--){
    22. ret[x][y]=value++;
    23. }
    24. line++; //范围缩小
    25. x += 1;
    26. y += 1;
    27. }
    28. if(n%2!=0){ //说明中间留有一个位置
    29. ret[x][y]=value;
    30. }
    31. return ret;
    32. }

  • 相关阅读:
    计算机网络_04_传输层
    异构网络互联;路由与转发;SDN基本概念;拥塞控制
    竞赛 深度学习 opencv python 公式识别(图像识别 机器视觉)
    ShellBrowser Delphi,Delphi组件功能和工具
    【软考 系统架构设计师】开发方法
    Spring Boot中的RESTful API详细介绍及使用
    MQTT-保留消息和遗嘱消息
    后端接口性能优化分析-数据库优化
    Speech | 轻量级语音合成论文详解及项目实现
    Git报错解决
  • 原文地址:https://blog.csdn.net/qq_62989250/article/details/134066287