目录
题目链接 977. 有序数组的平方 - 力扣(LeetCode)
题目链接 209. 长度最小的子数组 - 力扣(LeetCode)
Leetcode 977.有序数组的平方
题目链接 977. 有序数组的平方 - 力扣(LeetCode)
解题思路
利用双指针的思想,左右指针遍历数组,比较大小后平方放进新数组里面
代码实现
int* sortedSquares(int* A, int numsSize, int* returnSize){
int i = 0;
int j = numsSize-1;
int k = numsSize-1;
int *B = (int*)malloc(sizeof(int)*numsSize);
while(i<=j)
{
if(abs(A[i])>abs(A[j]))
{
B[k] = A[i]*A[i];
k--;
i++;
}
else
{
B[k] = A[j]*A[j];
k--;
j--;
}
}
*returnSize = numsSize;
return B;
}
总结
最大的数一定在两边,所以用双指针从两边开始遍历,将更大的放到新数组的最后
Leetcode 209.长度最小的子数组
题目链接 209. 长度最小的子数组 - 力扣(LeetCode)
解题思路
数组操作中一个重要的方法:滑动窗口。
所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
对于此题先固定起始位置,移动终止位置,满足之和大于target后,再移动起始位置,进行缩小范围。
代码实现
int minSubArrayLen(int target, int* nums, int numsSize){
int left = 0; //起始位置
int right = 0; //终止位置
int length ; //定义数组的过程的长度
int result = numsSize+1; //定义子数组的最终长度
int sum = 0; //元素和
for(right=0;right<numsSize;right++)
{
sum+=nums[right];
while(sum>=target)
{
length = right-left+1;
result = result<length?result:length; //如果满足判断条件,等于冒号前的值,否则等于冒号后
sum = sum-nums[left];
left++;
}
}
return result==numsSize+1?0:result; //如果result等于numSize+1,则结果等于0,否则等于result
}
总结
在看了carl老师的讲解视频后,对此题应用双指针的解法有了更深的理解。