数据结构与算法第二天

977、 有序数组的平方

            题目描述如下所示:

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

递减顺序 排序。

     思路:有序排列,我们可以考虑一下双指针的思想,但是本题的话需要额外空间存放排序后的

数组的平方,i,j 两个指针,要明确两个指针的含义,i,j指针用于遍历元素,j初始位置指向数组最

后一个位置,i指针初始指向新数组的第一个元素的位置,就是将i指针指向的元素与j指向的元素在

作比较,注意这两个元素比较的是平方,如果i指向的元素的平方,大于j指向的元素的平方,则将

nums[i]的平方放在新数组中,并且移动i的位置,相反,如果num[j]的平方大于num[i]的平方,则将

num[j]的平方放入新的数组中去,并将j向左移一位,以此类推即可,但是要注意循环的条件是i<=j

为啥是小于等于呢,因为等于的时候,这个元素是原数组的最后一个元素,但是还没有进入到新数

组里面去,因此要在循环一遍,将最后一个元素存进去即可。

int* sortedSquares(int* nums, int numsSize, int* returnSize){

       int *ret=(int *)malloc(sizeof(int)*numsSize);
       
       int i=0,j=numsSize-1,k=numsSize-1;  //k表示的是新数组要填充的位置,

        while(i<=j){

           if(nums[i]*nums[i]>=nums[j]*nums[j]){
                  ret[k--]=nums[i]*nums[i];
                  i++;
           }else{
                  ret[k--]=nums[j]*nums[j];
                  j--;
           }

        }
          
          *returnSize=numsSize;

          return ret;
}

209、长度最小的子数组

       给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的

连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

       我们可以这样想一个问题,首先要定义一个sum,用来求取元素的和,同时我们还要判断是否

sum>=target,如果符合,我么们应该记录此时当前子数组的长度,并于初始值min进行比较,如

果这个值比初始值还要小,则将这个值赋予min,同时还要进行试探,有没有比这个子数组长度还

要小的子数组,一直试探,直到sum<target为止。如果不符合的话,就继续往右移动即可,每移

动一次就要判断一下sum是否符合题意即可,下面用c++来写,之前都是用c语言写的,最近正好在

学c++,借此巩固一下。

        注意:上述红线的句子,如何将其转化为代码的形式,这个是本题的关键,而且思路也特别

的巧妙,建议多多研究。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
              
          int i=0,j;
          int sum=0;

          int length=nums.size();  //长度,

          int len=length+1;

          for(j=0;j<length;j++){
             
              sum+=nums[j];

                 while(sum>=target){ //注意这个是while循环,不是if,因为我们要一直试着移动i的位置,并不是只移动一次的,在满足条件的情况下,尽可能地往右移动,

                   len=min(len,j-i+1);
                   sum-=nums[i++];

                 }

          }
          return len==length+1?0:len;  //进行判断即可,注意加上这个判断语句是因为防止特殊情形,
就是所有的元素加在一起都没有大于target,此时应该返回0,

    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值