977.有序数组的平方问题
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例1
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
暴力解法就是,先计算每个数的平方,然后再进行排序。时间复杂度为O(n + nlog n),代码略。
双指针解法:
思路在于原来的数组本身就是从小到大排序,因此我们用两个指针从两边分别向内遍历,判断元素平方的大小,将较大值依次逆序放入答案数组中,即可实现答案数组由小到大排序。
//977 双指针法
int* sortedSquares(int* nums, int numsSize, int* returnSize){
//返回数组的大小等于原数组
*returnSize = numsSize;
//定义左右指针
int left=0;
int right=numsSize-1;
int i;
//动态开辟数组空间
int* result = (int *)malloc(sizeof(int)*numsSize);
//循环遍历,
for(i=numsSize-1;i>=0;i--){
//若左指针指向数的平方大于右指针,则将左指针的平方记入答案数组
//每次记录答案之后,i--,因为题目要求从小到大
if(nums[left]*nums[left]>nums[right]*nums[right]){
result[i]=nums[left]*nums[left];
left++;
}
else{
result[i]=nums[right]*nums[right];
right--;
}
}
return result;
}
PS : malloc 动态开辟空间,返回值为void *类型,因此要做强制转换
209.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3]是该条件下的长度最小的子数组。
思路:滑动窗口解法,一层for循环,用两个指针之间的区域进行滑动
//leetcode 209
//滑动窗口求解
int minSubArrayLen(int target, int* nums, int numsSize){
//定义长度
int length=0;
int i=0,j=0;
int sum=0;
int min=INT_MAX;//定义min初始值为无穷大
for(j;j<numsSize;j++){
sum += nums[j];
//累加求和,满足条件的时候进入循环
//进入循环向后位移,加上后一位,减去前一位
//若减去前一位之后仍满足sum>target,则再减去前一位 故用while,不可用if
while(sum>=target){
int length = j-i+1;
//
if(min>=length){
min = length;
}
sum = sum-nums[i];
i++;
}
}
//若min仍为无穷大,则没有满足条件的长度,返回0,否则就返回最小长度min
if(min == INT_MAX) return 0;
return min;
}