算法训练营第二天(7.13)| 数组Part02:双指针&滑动窗口

目录

双指针

LeeCode977. Squares of a Sorted Array

滑动窗口

LeeCode209. Minimum Size Subarray Sum

总结


双指针

LeeCode977. Squares of a Sorted Array

题目地址:力扣

题目类型:双指针

算法训练营第二天(7.13)| 数组Part02:双指针&滑动窗口_第1张图片

思路

  1. 要维护一个O(n)时间复杂读的算法,应想到双指针,left和right分别指向index = 0和index = n-1;
  2. 之后不断比较left和right指向元素的绝对值,依次压入数组vector,构造一个降序的vector
  3. 最后reserve数组
class Solution {
public:
    vector sortedSquares(vector& nums) {
        vector res;
        int i = 0, j = nums.size() - 1;
        while (i <= j) {
            if (abs(nums[i]) > abs(nums[j])) {
                res.emplace_back(pow(nums[i], 2));
                i++;
            }
            else {
                res.emplace_back(pow(nums[j], 2));
                j--;
            }
        }
        reverse(res.begin(), res.end());
        return res;
    }
};

滑动窗口

滑动窗口可以理解为是双指针的特例,滑动窗口中,指针left和right的移动方向是一致的,看起来像是一个向右滑动的、大小可变的窗口数组。

LeeCode209. Minimum Size Subarray Sum

题目地址:力扣

题目类型:滑动窗口

算法训练营第二天(7.13)| 数组Part02:双指针&滑动窗口_第2张图片

 思路

  • 窗口就是 满足其和 ≥ target 的长度最小的连续子数组。
  • 窗口的起始位置如何移动:如果当前窗口的值大于target了,窗口就要向前移动了(也就是该缩小了)。
  • 窗口的结束位置如何移动:(此处有坑,需要考虑两种情况)
    • 当right未到达数组尾端,right还可以继续移动
    • 当right已到达数组尾端,right不可以继续移动
class Solution {
public:
    int minSubArrayLen(int target, vector& nums) {
        int i = 0, j = 0;
        int sum = nums[0];
        int count = 1, ans = 1e5 + 10;
        // 把第一种情况单独拿出来比较
        if (sum >= target) ans = count;
        while (i <= j) {
            // j还不到最后一位,i和j都可以移动
            if (j < nums.size() - 1) {
                if (sum >= target) {
                    sum -= nums[i];
                    i++;
                    count--;
                }
                else {
                    j++;
                    sum += nums[j];
                    count++;
                }
            }
            // j已经在最后一位,只能移动i
            else {
                // 如果此时的总和sum已经小于target,则没有继续下去的必要,直接退出
                if (sum < target) break;
                else {
                    sum -= nums[i];
                    i++;
                    count--;
                }
            }
            // 更新
            if (sum >= target) ans = min(ans, count);
        }
        if (ans == 1e5 + 10) return 0;
        return ans;
    }
};

总结

经过昨天的博客训练,今天写的更加得心应手一些,明天继续,加油!

你可能感兴趣的:(算法训练营,数据结构,c++,算法,leetcode)