当前位置: 首页 > news >正文

代码随想录 算法训练 Day2:数组

题目

209.长度最小的子数组

题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。

力扣题目链接(opens new window)

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例:

  • 输入:s = 7, nums = [2,3,1,2,4,3]
  • 输出:2
  • 解释:子数组 [4,3] 是该条件下的长度最小的子数组。

提示:

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5

视频讲解:拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili

59.螺旋矩阵II

题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。

力扣题目链接(opens new window)

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

视频讲解:一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili

区间和

前缀和是一种思维巧妙很实用 而且 很有容易理解的一种算法思想,大家可以体会一下

题目链接(opens new window)

题目描述

给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。

输入描述

第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间,直至文件结束。

输出描述

输出每个指定区间内元素的总和。

输入示例

5
1
2
3
4
5
0 1
1 3

输出示例

3
9

数据范围:

0 < n <= 100000

开发商购买土地

#TODO,少这道题,明天补

代码

public class Array2 {/*** 寻找满足其和 ≥ s 的长度最小的子数组* 时间复杂度:O(n),空间复杂度:O(1)* * @param s 目标和* @param nums 输入数组* @return 满足条件的最小子数组长度,如果不存在则返回0*/public static int minSubArrayLen(int s, int[] nums) {int left = 0;                  // 滑动窗口左边界int sum = 0;                   // 当前窗口内的元素和int minLength = Integer.MAX_VALUE;  // 最小子数组长度,初始化为最大整数值int n = nums.length;           // 数组长度// 右指针遍历整个数组for (int right = 0; right < n; right++) {sum += nums[right];        // 将当前元素加入窗口// 当窗口内元素和大于等于目标值时,尝试缩小窗口while (sum >= s) {int subLength = right - left + 1;  // 计算当前窗口长度minLength = Math.min(minLength, subLength);  // 更新最小长度sum -= nums[left];     // 移除窗口最左侧元素left++;                // 左指针右移}}// 如果minLength仍为初始值,说明没有找到满足条件的子数组return minLength == Integer.MAX_VALUE ? 0 : minLength;}/*** 生成螺旋矩阵* 按照顺时针螺旋顺序填充1到n²的元素到n×n矩阵中* 时间复杂度:O(n²),空间复杂度:O(n²)* * @param n 矩阵大小* @return 生成的n×n螺旋矩阵*/public static int[][] generateMatrix(int n) {// 创建n×n的二维数组用于存储结果int[][] nums = new int[n][n];// 定义每一圈的起始坐标点int startX = 0, startY = 0;  // startX表示行起点,startY表示列起点// offset用于控制每一条边遍历的长度,初始值为1是因为左闭右开的遍历方式int offset = 1;// count表示当前要填入矩阵的数字,从1开始递增int count = 1;  // 矩阵中需要填写的数字// loop表示当前遍历的圈数,从最外圈开始int loop = 1; // 记录当前的圈数// i和j用于在循环中表示当前的行和列索引int i, j; // j 代表列, i 代表行;// 对于n×n的矩阵,最多有n/2个完整的圈// 例如:3×3矩阵有1个完整圈,4×4矩阵有2个完整圈while (loop <= n / 2) {// 每一圈的遍历分为四个步骤:上边、右边、下边、左边// 步骤1:从左到右遍历上边// 左闭右开区间[startY, n-offset),即不包含最右侧的元素for (j = startY; j < n - offset; j++) {nums[startX][j] = count++; // 填充数字并递增}// 步骤2:从上到下遍历右边// 左闭右开区间[startX, n-offset),即不包含最下侧的元素for (i = startX; i < n - offset; i++) {nums[i][j] = count++; // 注意此时j已经是上一个循环结束的值}// 步骤3:从右到左遍历下边// 左闭右开区间(startY, j],即不包含最左侧的元素for (; j > startY; j--) {nums[i][j] = count++; // 注意此时i已经是上一个循环结束的值}// 步骤4:从下到上遍历左边// 左闭右开区间(startX, i],即不包含最上侧的元素for (; i > startX; i--) {nums[i][j] = count++; // 注意此时j已经是上一个循环结束的值}// 完成一圈的遍历后,更新下一圈的起始点和参数startX++; // 行起点向下移动一位startY++; // 列起点向右移动一位offset++; // 偏移量增加,使得下一圈的边长减少loop++;   // 圈数增加}// 特殊情况处理:当n为奇数时,矩阵中心位置需要单独赋值if (n % 2 == 1) { // n 为奇数时,单独处理矩阵中心的值nums[startX][startY] = count; // 此时startX和startY正好指向矩阵中心}return nums; // 返回填充完成的螺旋矩阵}/*** 计算指定区间内元素的总和* 使用前缀和优化区间查询* 时间复杂度:预处理O(n),每次查询O(1)* 空间复杂度:O(n)* * @param arr 输入数组* @param queries 查询区间数组,每个查询是一个长度为2的数组,表示[left, right]* @return 每个查询区间的元素总和*/public static int[] rangeSum(int[] arr, int[][] queries) {int n = arr.length;int q = queries.length;// 计算前缀和数组// prefixSum[i]表示arr[0]到arr[i-1]的和int[] prefixSum = new int[n + 1];for (int i = 0; i < n; i++) {prefixSum[i + 1] = prefixSum[i] + arr[i];}// 计算每个查询区间的和int[] results = new int[q];for (int i = 0; i < q; i++) {int left = queries[i][0];int right = queries[i][1];// 区间和 = prefixSum[right+1] - prefixSum[left]results[i] = prefixSum[right + 1] - prefixSum[left];}return results;}/*** 打印矩阵* * @param matrix 要打印的矩阵*/public static void printMatrix(int[][] matrix) {System.out.println("[");for (int i = 0; i < matrix.length; i++) {System.out.print("  [");for (int j = 0; j < matrix[0].length; j++) {System.out.print(matrix[i][j]);if (j < matrix[0].length - 1) {System.out.print(", ");}}System.out.print("]");if (i < matrix.length - 1) {System.out.println(",");} else {System.out.println();}}System.out.println("]");}public static void main(String[] args) {// 测试最小子数组长度int[] arr = {2, 3, 1, 2, 4, 3};int s = 7;System.out.println("最小子数组长度: " + minSubArrayLen(s, arr));// 测试螺旋矩阵System.out.println("\n生成3×3螺旋矩阵:");int[][] spiralMatrix = generateMatrix(3);printMatrix(spiralMatrix);System.out.println("\n生成4×4螺旋矩阵:");spiralMatrix = generateMatrix(4);printMatrix(spiralMatrix);// 测试区间求和System.out.println("\n测试区间求和:");int[] testArr = {1, 2, 3, 4, 5};int[][] queries = {{0, 1}, {1, 3}, {0, 4}};System.out.println("原始数组: ");for (int num : testArr) {System.out.print(num + " ");}System.out.println();int[] sums = rangeSum(testArr, queries);System.out.println("区间查询结果:");for (int i = 0; i < queries.length; i++) {System.out.println("区间 [" + queries[i][0] + ", " + queries[i][1] + "] 的和: " + sums[i]);}}
}

相关文章:

  • 缺乏需求优先级划分时,如何合理分配资源?
  • Python网络请求利器:urllib库深度解析
  • c++ std::deque
  • Linux/Centos7离线安装并配置MySQL 5.7
  • 微服务概述
  • Loki的部署搭建
  • OpenCV 图像直方图:从原理剖析到实战应用
  • C++多态实现的必要条件剖析
  • unordered_set和unordered_map
  • AtCoder 第405场初级竞赛 A~E题解
  • 从理论到实战:模糊逻辑算法的深度解析与应用实践
  • 全面掌握JSR303校验:从入门到实战
  • 开发技术.前端开发相关问题
  • 2023年河南CCPC->F题
  • 《Python星球日记》 第81天:回看图像生成与风格迁移
  • 第一个优化
  • 2025年5月15日
  • 策略模式-枚举实现
  • 【蓝桥杯嵌入式】【模块】四、按键相关配置及代码模板
  • (6)python开发经验
  • “16+8”“生酮饮食”,网红减肥法究竟靠谱吗?
  • 人民日报整版聚焦:外贸产品拓内销提速增量,多地加快推动内外贸一体化
  • “一百零一个愿望——汉字艺术展”亮相意大利威尼斯
  • 中国乒协坚决抵制恶意造谣,刘国梁21日将前往多哈参加国际乒联会议
  • 4月新增社融1.16万亿,还原地方债务置换影响后信贷增速超过8%
  • 浙能集团原董事长童亚辉被查,还是杭州市书法家协会主席