双指针可以有效减少循环,主要是理解题目。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums)
{
int left = 0;
int right = nums.size()-1;
vector<int> ans(nums.size(), 0);
int id = nums.size()-1;
while (left <= right)
{
if (nums[left]*nums[left] >= nums[right]*nums[right])
{
ans[id] = nums[left]*nums[left];
left++;
id--;
}
else
{
ans[id] = nums[right]*nums[right];
right--;
id--;
}
}
return ans;
}
};
注意审题,还以为是找出等于总和target的最小数组,想用01背包去做,但无从下手;正确审题后还是会有疑惑,没想到每次应如何算总和,滑动窗口实际上也是双指针,每次使用双指针时要根据具体情况去初始指针,这点很重要,还是应该多刷题才能掌握
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums)
{
int result = -1;
int sum = 0;
int i=0;
int length = 0;
for (int j=0; j<nums.size();j++)
{
sum += nums[j];
while (sum >= target)
{
length = j-i+1;
if (result < 0) result = length;
else result = result < length ? result : length;
sum -= nums[i++];
}
}
return result<0 ? 0 : result;
}
};
一道精品题,没啥时间仔细理解,周日补一下