977.有序数组的平方
参考双指针的用法,想到从两边开始比较找到绝对值最大的数,然后取平方值放到数组的末尾,然后末尾指针往前移动,两边挑选到的位置也进行更新一步
*** 踩了一个坑:本来想通过 #define ABS(a) a > 0 ? (a) : ((a) *(-1)) 来计算绝对值,但是结果不对,后面有时间再看看原因?
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int absfun(int a)
{
if(a < 0) {
return -a;
}
return a;
}
int ret[10010];
int* sortedSquares(int* nums, int numsSize, int* returnSize){
int cnt = numsSize-1;
int tmp;
for(int i = 0,j = numsSize-1; i <= j && j >= 0; ) {
if(absfun(nums[j]) < absfun(nums[i])) {
tmp = nums[i];
i++;
} else {
tmp = nums[j];
j--;
}
ret[cnt--] = tmp *tmp;
}
*returnSize = numsSize;
return ret;
}
这个题自己刚开始没有好的优化想法,最后看了卡哥的双指针思路,才想出来办法,技巧性比较强,感觉缺乏通用性。
int minSubArrayLen(int target, int* nums, int numsSize){
int left = 0;
int right = 0;
int ret = 100010;
int sum = 0;
for(right = 0; right < numsSize; right++) {
sum += nums[right];
while(sum >= target && left <= right) {
if(ret > right -left +1) {
ret = right - left +1;
}
sum -= nums[left];
left++;
}
}
if(ret == 100010) {
return 0;
}
return ret;
}
59.螺旋矩阵II
这个题后面抽时间做,优先级放低。