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,
}
};