题目描述:
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
本题最直接也是最直观的思路,将元素平方后,再对元素进行排序即可得到最终的结果,不过这样做的时间复杂度取决于排序算法的时间复杂度,如果采用快排来进行排序,时间复杂度也是。本文不再赘述。不知读者在读题时是否注意到了有序数组,不要忽略此条件非常重要。下面介绍另外一种方法,双指针法。由于原数组有序,且按非递减顺序排列,因此当数组中存在负数时,可能会导致平方后顺序的变化,例如序列:-5 ,1, 2, 3, 4平方后序列为25、1、4、9、16,注意到正数部分序列相对位置不变,负数部分由于平方后,平方后的数值会变大,导致相对顺序发生改变,数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。因此可以考虑双指针法:i指向起始位置,j指向终止位置。比较i,j指向位置的平方的值,最大值放入result(结果)数组中【注意此处的result应从最大下标开始递减存储】。依次遍历,类似与归并排序的思路直至i>j时结束。具体过程如下:
定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。
如果A[i] * A[i] < A[j] * A[j]
那么result[k--] = A[j] * A[j];
。
如果A[i] * A[i] >= A[j] * A[j]
那么result[k--] = A[i] * A[i];
。
具体代码实现如下:
int power(int a)
{
return a*a;
}
int* sortedSquares(int* nums, int numsSize, int* returnSize)
{
int *new_nums = (int*)malloc(sizeof(4)*numsSize);
for(int k=0;k=power(nums[j])){
new_nums[*returnSize] = power(nums[i]);
i++;(*returnSize)--;
continue;
}
if(power(nums[i])
题目描述:
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3]
是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4] 输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0
这里仅介绍滑动窗口法,因为暴力法,双层for循环在leetcode运行时已超时。滑动窗口法的精髓就在与用滑动窗口实现了两层for循环的功能。具体实现由以下过程实现,
int minSubArrayLen(int target, int* nums, int numsSize) {
int start = 0, sum = 0,result=0x7fffffff;
for(int end = 0;end < numsSize;end++){
sum+=nums[end];
while(sum>=target){
result = result<(end-start+1) ? result : (end-start+1);
sum -= nums[start];
start++;
}
}
return result == 0x7fffffff? 0:result; //针对不满足的序列,及不存在满足题意的序列
}