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

LeetCode Hot 100 第8天

1. 73 矩阵置零(记录标识)

链接:题目链接
题解

题解 时间复杂度O(n*m)

  1. 方案1(空间复杂度O(n + m)):matrix[i][j] = 0,意味着 第i行、第j列所有元素都要置为0;维护能置为0行、列的集合rowSet、columnSet;最后再遍历置0既可
  2. 方案2(空间复杂度O(1)):能否把上述rowSet、columnSet记录在matrix数组中?
  3. 如果matrix[i][j] = 0,记录在matrix[0][j] = 0、matrix[i][0] = 0(这两个值本身就要置为0),会导致不知道第0行、0列是否需要置为0
  4. 那么单独用两个变量记录第0列、第0行是否需要 置为0就行了
  5. 注意:在根据matrix[i][0]、matrix[0][j] = 0 将当前列、当前行置为0的时候,不需要处理第0列、第0行(会影响接下来的遍历),且第0行第0列有单独的变量标识处理

代码

// 方案1public void setZeroes(int[][] matrix) {// 行 x... 用常数来记录下来// 列 y... 用常数来记录下来int rowLen = matrix.length;int columnLen = matrix[0].length;Set<Integer> rowZeroSet = new HashSet<>(rowLen);Set<Integer> columnZeroSet = new HashSet<>(columnLen);for (int i = 0; i < rowLen; ++ i) {for (int j = 0; j < columnLen; ++ j) {if (matrix[i][j] == 0) {rowZeroSet.add(i);columnZeroSet.add(j);}}}for (Integer index: rowZeroSet) {Arrays.fill(matrix[index], 0);}for (Integer index: columnZeroSet) {for (int i = 0; i < rowLen; ++ i) {matrix[i][index] = 0;}}}// 方案2
class Solution {public void setZeroes(int[][] matrix) {int rowLen = matrix.length;int columnLen = matrix[0].length;boolean rowZeroFlag = false, columnZeroFlag = false;for (int[] value : matrix) {if (value[0] == 0) {columnZeroFlag = true;break;}}for (int i = 0; i < columnLen; ++ i) {if (matrix[0][i] == 0) {rowZeroFlag = true;break;}}for (int i = 1; i < rowLen; ++ i) {for (int j = 1; j < columnLen; ++ j) {if (matrix[i][j] == 0) {matrix[0][j] = 0;matrix[i][0] = 0;}}}for (int i = 1; i < rowLen; ++ i) {if (matrix[i][0] == 0) {Arrays.fill(matrix[i], 0);}}for (int i = 1; i < columnLen; ++ i) {if (matrix[0][i] == 0) {for (int j = 0; j < rowLen; ++ j) {matrix[j][i] = 0;}}}if (columnZeroFlag) {for (int i = 0; i < rowLen; ++ i) {matrix[i][0] = 0;}}if (rowZeroFlag) {for (int i = 0; i < columnLen; ++ i) {matrix[0][i] = 0;}}}
}

2. 54 螺旋矩阵(模拟 + 边界判断)

链接:题目链接
题解

题解 时间复杂度O(n*m)

  1. 按照逆时针转动(左 -> 下 -> 右 -> 上)
  2. 记录左 -> 下 -> 右 -> 上的边界,维护边界既可
  3. 注意:如果左 -> 下 -> 右 -> 上,其中一条路走不通的话,就终止循环(例如左 -> 右 -> 上(少了下),往左走完,没办法往下走,往如果直接往右走,那么就会重复记录,如果往上走,也会走不通)

代码

class Solution {public List<Integer> spiralOrder(int[][] matrix) {int l = 0, r = matrix[0].length - 1, low = 0, hight = matrix.length - 1;List<Integer> ans = new ArrayList<>();while (true) {// 往右走if (l > r) {break;}for (int i = l; i <= r; ++ i) {ans.add(matrix[low][i]);}low ++;// 往下走if (low > hight) {break;}for (int i = low; i <= hight; ++ i) {ans.add(matrix[i][r]);}r --;// 往左走if (l > r) {break;}for (int i = r; i >= l; -- i) {ans.add(matrix[hight][i]);}hight --;// 往上走if (low > hight) {break;}for (int i = hight; i >= low; -- i) {ans.add(matrix[i][l]);}l ++;}return ans;}
}

3. 2461 长度为 K 子数组中的最大和(双指针)

链接:题目链接
题解

题解 时间复杂度O(n)

  1. 维护一个左右指针[l, r],保证 [l, r]区间内没有重复数字
  2. 向右移动r指针,如果[l, r]区间内出现过nums[r + 1]数字,那么向右移动l指针,直至[l, r+1]没有重复数字
  3. 如果[l, r]区间大小 > k,需要向右移动l指针
  4. 需要维护一个区间和,方便取最大值

代码

class Solution {public long maximumSubarraySum(int[] nums, int k) {int len = nums.length;Set<Integer> numSet = new HashSet<>();long sum = 0;long ans = 0;for (int i = 0, j = 0; i < len; ++ i) {while (numSet.contains(nums[i])) {sum -= nums[j];numSet.remove(nums[j]);j ++;}numSet.add(nums[i]);sum += nums[i];if (i - j + 1 == k) {ans = Math.max(ans, sum);sum -= nums[j];numSet.remove(nums[j]);j++;}}return ans;}
}

如果对你有帮助,辛苦点个赞,谢谢啦,朋友!!!

http://www.xdnf.cn/news/19118.html

相关文章:

  • 群组分析 (Cohort Analysis)——哪批用户最优质?
  • 【Spring底层分析】Spring AOP补充以及@Transactional注解的底层原理分析
  • 12大主流本地文档管理系统功能与价格对比分析
  • 如何设置阿里云轻量应用服务器镜像?
  • v-model与v-bind区别
  • LG P5386 [Cnoi2019] 数字游戏 Solution
  • CesiumJS 介绍以及基础使用
  • 【完整源码+数据集+部署教程】硬币分类与识别系统源码和数据集:改进yolo11-SWC
  • GoogLeNet:深度学习中的“卷积网络变形金刚“
  • 从“安全诉讼”说起:奖励模型(Reward Model)是LLM对齐的总阀门(全视角分析)
  • 如何在实际应用中选择Blaze或Apache Gluten?
  • 【拍摄学习记录】06-构图、取景
  • 表复制某些字段的操作sql
  • LeetCode - 283. 移动零
  • 【lua】Lua 入门教程:从环境搭建到基础编程
  • 【面试场景题】dubbo可以使用自定义的序列化协议吗
  • 【ACP】2025-最新-疑难题解析-11
  • 虚拟内存和虚拟页面
  • 海量小文件问题综述和解决攻略(二)
  • Spring框架集成Kakfa的方式
  • 【完整源码+数据集+部署教程】工地建筑进度监测系统源码和数据集:改进yolo11-SDI
  • 【WebRTC】从入门到忘记
  • pytest使用allure测试报告
  • 迁移学习实战:医疗影像识别快速突破方案
  • 【查看css技巧】hover或者其他方式触发出来的样式如何查看
  • npm使用的环境变量及其用法
  • Socket编程核心API与结构解析
  • Java-面试八股文-Mysql篇
  • 【C语言】深入理解指针(1)
  • 什么是策略模式?策略模式能带来什么?——策略模式深度解析:从概念本质到Java实战的全维度指南