第一题:
1.有序数组的平方,暴力方法直接每个元素平方后排序,排序函数:
sort(nums.begin(),nums.end()); //快速排序方法
2.双指针方法:对于有序数组,新数组的最大值肯定在原数组的两端,直接左右一边一个指针。
注:第一次没通过的原因在于只考虑了右边指针,左指针没有动,没有考虑数组内部的大小排序
3.有序数组平方后,最小值大概率来自中间,除了负数序列,最小值来自右端,正序列,最小值来自左端,所以直接两端大小对比
第二题:
1.第一次使用双指针,错误原因,漏写了最小判断,可能最短子数组在序列中间找到了,但没有保存,循环到最后所以是1。
2.滑动窗口方法
移动窗口右端,直到子序列大于目标值;
大于目标值之后移动窗口左端,重点在移动左端的时候,i要+1
int result=INT32_MAX; ///宏
int sum=0;
int i=0;
int subLength=0;
for(int j=0;j<nums.size();j++)
{
sum+=nums[j];
while(sum>=target)
{
subLength=j-i+1;
result=result<subLength?result:subLength;//如果新的子序列更小,取更小的
sum-=nums[i++];//这里很妙,重点在i++上,如果是减去nums[i],最后滑动窗口的左值就是应该被删掉的那个,现在滑动窗口左值是新的
}
}
return result==INT32_MAX?0:result;
3.之前的错误在于,result始终取最小的,增加一个判断:
esult=result<subLength?result:subLength;//如果新的子序列更小,取更小的
第三题:
重点在左开右闭;循环圈数=n/2;n为奇数的时候,最中间还有一个单独的数;