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

LeetCode 977. 有序数组的平方

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

// 双指针
vector<int> sortedSquares(vector<int>& nums) {
    int left = 0;
    int right = nums.size() - 1;
    int i =  nums.size() - 1;
    vector<int> 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<int>& 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<vector<int>> generateMatrix(int n) {
    vector<vector<int>> res(n, vector<int>(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;
}

数组专项总结

  • 双指针
  • 滑动窗口
  • 查找
    • 二分查找
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
抱歉,由于时间限制和技术限制,我无法为您提供完整的代码。但是,我可以向您解释一下如何使用二维数组指针数组来实现日历。 首先,我们需要一个二维数组来存储每个月的天数和每个月的第一天是星期几。例如,我们可以定义一个名为calendar的数组,它包含12行和2列。第一列存储每个月的天数,第二列存储每个月的第一天是星期几。 ```c int calendar[12][2] = { {31, 2}, // January {28, 5}, // February {31, 5}, // March {30, 1}, // April {31, 3}, // May {30, 6}, // June {31, 1}, // July {31, 4}, // August {30, 0}, // September {31, 2}, // October {30, 5}, // November {31, 0} // December }; ``` 接下来,我们需要一个指针数组来存储每个月的日历。我们可以定义一个名为month的指针数组,它包含12个指向int类型的指针。每个指针都指向一个包含每个月日历的二维数组。 ```c int* month[12]; ``` 然后,我们可以使用一个for循环来创建每个月的日历。在每个月的循环中,我们需要使用malloc函数动态分配一个二维数组,然后使用for循环填充日历。 ```c for (int i = 0; i < 12; i++) { int days = calendar[i][0]; int first_day = calendar[i][1]; int week_day = 0; month[i] = (int*)malloc(6 * 7 * sizeof(int)); for (int j = 0; j < 6 * 7; j++) { if (j < first_day || j >= first_day + days) { month[i][j] = 0; } else { month[i][j] = j - first_day + 1; } } } ``` 最后,我们可以使用另一个for循环来打印整个日历。在每个月的循环中,我们需要使用for循环打印日历的表头和每一天的日期。 ```c for (int i = 0; i < 12; i++) { printf("%d月\n", i + 1); printf("日 一 二 三 四 五 六\n"); int days = calendar[i][0]; int first_day = calendar[i][1]; int week_day = 0; for (int j = 0; j < 6 * 7; j++) { if (j < first_day || j >= first_day + days) { printf(" "); } else { printf("%2d ", month[i][j]); } week_day++; if (week_day == 7) { printf("\n"); week_day = 0; } } printf("\n"); } ``` 这就是如何使用二维数组指针数组来实现日历的基本过程。当然,这只是一个简单的例子,您可以根据自己的需求和喜好进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值