力扣第977题-有序数组的平方
题目描述
给你一个按 非递减顺序 排序的整数数组 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]
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 已按 非递减顺序 排序
代码及思路
代码如下
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* sortedSquares(int* nums, int numsSize, int* returnSize) {
int *ans = malloc(sizeof(int)*numsSize);
*returnSize=numsSize;
int k= numsSize-1;
for(int i=0,j=numsSize-1;i<=j;){
if(nums[i]*nums[i]<nums[j]*nums[j]){
ans[k]=nums[j]*nums[j];
k--;
j--;
}
else {
ans[k]=nums[i]*nums[i];
i++;
k--;
}
}
return ans;
}
思路
采用双指针的办法,先申请一个和原数组一样大的内存,用来按顺序存放平方后的数,首先令i和j指针,i从下标为0开始指,j从最后一个数组元素开始指,采用for循环,依次比较每一次平方后的较大数,将这个数存入新数组的最后一个元素,新数组采用逆序的方法。为什么不采用从小到大呢?因为原数组是按从小到大排列,如果有负数,那么平方后最大数一定是第一个或者是最后一个,比较好容易找出最大平方数,所以采用逆序。
力扣第209-长度最小的子数组
题目描述
给定一个含有 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
提示:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105
代码及思路
代码
int minSubArrayLen(int target, int* nums, int numsSize) {
int result=INT_MAX;
int sum=0;
int sub=0;
int i=0,j=0;
for(j=0;j<numsSize;j++){
sum+=nums[j];
while(sum>=target){
sub=j+1-i;
result=result<sub? result:sub;
sum=sum-nums[i];
i++;
}
}
return result==INT_MAX? 0:result;
}
思路
该题采用滑动窗口的方法,滑动窗口其实也就是双指针,先用j指针来遍历,用sum来记录j指针所遍历的数组元素的值之和,当sum>=目标值,
让j先不继续往下遍历,确定当前数组长度,然后将左边的i指针往前移动,缩短窗口的值,再次判断此时sum的值和目标值,所以用一个while循环,最后将每次满足循环的值赋给result,遍历完后,最后判断再遍历过程中,result的值是否发生改变,若改变,则返回改变的值,否则,返回0.