DAY2:有序数组的平方(双指针)与长度最小的子数组(滑动窗口)

有序数组的平方

题目描述:

给你一个按 非递减顺序 排序的整数数组 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]

本题最直接也是最直观的思路,将元素平方后,再对元素进行排序即可得到最终的结果,不过这样做的时间复杂度取决于排序算法的时间复杂度,如果采用快排来进行排序,时间复杂度也是o(nlogn)。本文不再赘述。不知读者在读题时是否注意到了有序数组,不要忽略此条件非常重要。下面介绍另外一种方法,双指针法。由于原数组有序,且按非递减顺序排列,因此当数组中存在负数时,可能会导致平方后顺序的变化,例如序列:-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循环的功能。具体实现由以下过程实现,

  1. 初始时将i,j分别定义为窗口左边界与右边界,初始时i,j初值均设置为0及窗口大小为0
  2. 将右边界向后移动,直至累加和大于目标值,此时记录窗口大小(j-i+1),并将其与最佳窗口(result)大小进行比较,若更小则更新最佳窗口,否则不进行更新。
  3. 移动窗口左边界,并将sum减去相应的值
  4. 注意特殊情况:例如序列为1,1,1,1,1 target = 7,此时返回结果应为0,但由于result初始化为最大整数,返回结果错误,故在最后需进行一次调整。
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; //针对不满足的序列,及不存在满足题意的序列 
}

 

你可能感兴趣的:(算法,数据结构,leetcode)