Day2 数组专项—双指针、滑动窗口

LeetCode 977. 有序数组的平方

解题思路:双指针法,前后并行

// 双指针
vector sortedSquares(vector& nums) {
    int left = 0;
    int right = nums.size() - 1;
    int i =  nums.size() - 1;
    vector result(nums.size(), 0);
    while(left <= right) {
      int left_value = nums[left] * nums[left];
      int right_value = nums[right] * nums[right];
      if (left_value > right_value) {
        result[i--] = left_value;
        left++;
      } else {
        result[i--] = right_value;
        right--;
      }
    }
    return result;
}

LeetCode 209. 长度最小的子数组

解题思路:滑动窗口

// 滑动窗口
int minSubArrayLen(int target, vector& nums) {
    int result = __INT32_MAX__;
    int i = 0;         // 窗口起始位置
    int sum = 0;       // 窗口值
    for (int j = 0; j < nums.size(); j++) {
      sum += nums[j];
      while (sum >= target) {
        int sublen = j - i + 1;
        result = sublen < result ? sublen : result;
        sum -= nums[i++];
      }
    }
    return result == __INT32_MAX__? 0 : result;
}

LeetCode 59. 螺旋矩阵

解题思路:考虑好所有的边界条件,例如圈数、左右区间、偏移量

vector> generateMatrix(int n) {
    vector> res(n, vector(n, 0));
    int startx = 0, starty = 0;    // 起始位置
    int loop = n / 2;              // 循环圈数
    int mid = n / 2;               // 如果n为奇数,用于索引矩阵中心点
    int count = 1;                 // 用于矩阵赋值
    int offset = 1;                // 每一圈区间右侧的偏移量
    while (loop--) {
      int i = startx;
      int j = starty;

      for (j = starty; j < n - offset; j++) {
        res[startx][j] = count++;
      }

      for (i = startx; i < n - offset; i++) {
        res[i][j] = count++;
      }

      for (; j > starty; j--) {
        res[i][j] = count++;
      }

      for (; i > startx; i--) {
        res[i][j] = count++;
      }

      startx++;
      starty++;
      offset++;
    }

    if (n % 2 != 0) {
      res[mid][mid] = count;
    }
    return res;
}

数组专项总结

  • 双指针
  • 滑动窗口
  • 查找
    • 二分查找

你可能感兴趣的:(算法学习,算法,c++)