有序数组的平方
题目描述:给定一个非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
思路
依旧是双指针
由于数组最开始是按照非递减顺序排列的,因此数字平方越大的越接近两边。
具体来说,如果序列中只有正数或只有负数,那么比较好说;
而如果序列中既有正数,也有负数的话,那么序列中间的数更加接近0,其平方比较小,序列两边的数离0比较远,其平方反而比较大。
因此,有双指针依次从两边往中间缩小,找到平方从大到小的数字。
代码
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
int left = 0, right = n - 1;
vector<int> result(n, 0);
for (int i = 0; i < n; i++)
nums[i] = nums[i] * nums[i];
for (int i = n - 1; i >= 0; i--)
{
if (nums[left] > nums[right])
{
result[i] = nums[left];
left++;
}
else
{
result[i] = nums[right];
right--;
}
}
return result;
}
};
长度最小的子数组
题目描述:给定一个含有 n 个正整数的数组和一个正整数 target。找出该数组中满足其和 >= target 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回0。
思路
本题 滑动窗口
参考:labuladong.gitee.io/algo/di-lin…
模版:
int left = 0, right = 0;
while (right < nums.size())
{
window.add(nums[right]);
right++; // 增大窗口
···
// 在可以进行debug
while (window needs shrink) // 判断左侧窗口是否要收缩
{
window.remove(nums[left]);
left++; // 缩小窗口
···
}
}
数组中的每个元素都只会进入窗口一次,然后被移出窗口一次,因此时间复杂度与数组的长度成正比,即O(n)。
代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0, right = 0; // [left, right)
int minLen = nums.size() + 1;
int sum = 0;
while (right < nums.size())
{
sum += nums[right++]; // add
// cout << sum << endl; // for debug
while (sum >= target) // delete
{
if (right - left < minLen)
minLen = right - left;
sum -= nums[left++];
}
}
if (minLen != nums.size() + 1)
return minLen;
else
return 0;
}
};