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

hot100做题整理(11-20)

文章目录

      • 1.滑动窗口最大值
      • 2.最小覆盖子串(跳过)**
      • 3.最大子数组和
      • 4.合并区间
      • 5.轮转数组
      • 6.除自身以外数组的乘积
      • 7.缺失的第一个正数
      • 8.矩阵置零
      • 9.螺旋矩阵
      • 10.旋转图像

1.滑动窗口最大值

考察双端队列的使用
1.右边进,左边出,左边元素始终维护队列的最大值
Deque deque = new LinkedList<>(); // 定义双端队列
deque.peekLast() deque.peekFirst() 获取首尾元素
deque.addLast() deque.addFirst() 添加元素
deque.removeLast() deque.removeFirst() 删除元素

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int[] res = new int[nums.length-k+1];Deque<Integer> deque = new LinkedList<>();int index = 0;for (int i = 0; i < nums.length; i++) {// pushwhile (!deque.isEmpty() && nums[i] > deque.peekLast()) {deque.removeLast();}deque.addLast(nums[i]);// popif (i-k>=0 && nums[i-k] == deque.peekFirst()) {deque.removeFirst();}// resif (i-k+1>=0) {res[index] = deque.peekFirst();index++; }}return res;}
}

2.最小覆盖子串(跳过)**

3.最大子数组和

考察贪心算法实现
极小值的表示:Integer.MIN_VALUE

class Solution {public int maxSubArray(int[] nums) {int maxRes = Integer.MIN_VALUE;  // 初始化成极小值int curRes = 0;for (int num : nums) {curRes += num;maxRes = Math.max(maxRes, curRes);if (curRes < 0) {curRes = 0;}}return maxRes;}
}

4.合并区间

考察区间的合并
Arrays.sort(arr, (a,b)->a[0]-b[0]) 排序第一个元素
list.get(list.size()-1);获取集合的最后一个元素
list.toArray(new int[list.size()][]) 集合转数组元素

class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals, (a, b) -> a[0]-b[0]);List<int[]> list = new ArrayList<>();list.add(intervals[0]);for (int i = 1; i < intervals.length; i++) {int[] lastElem = list.get(list.size()-1);if (lastElem[1] >= intervals[i][0]) {lastElem[1] = Math.max(lastElem[1], intervals[i][1]);} else {list.add(intervals[i]);}}return list.toArray(new int[list.size()][]);}
}

5.轮转数组

考察转圈,k = k % nums.length
主要还是双指针的应用

class Solution {public void rotate(int[] nums, int k) {k =k % nums.length;reverse(nums, 0, nums.length-1);reverse(nums, 0, k-1);reverse(nums, k, nums.length-1);}public void reverse(int[] nums, int left, int right) {while (left < right) {int temp = nums[left];nums[left] = nums[right];nums[right] = temp;left++;right--;}}
}

6.除自身以外数组的乘积

前缀积和后缀积的使用
计算除这个元素以外的前缀积和后缀积,他们相乘就是结果

class Solution {public int[] productExceptSelf(int[] nums) {// 前缀积和后缀积int[] pre = new int[nums.length];pre[0] = 1;for (int i = 1; i < nums.length; i++) {pre[i] = pre[i-1] * nums[i-1];}int[] after = new int[nums.length];after[nums.length-1] = 1;for (int i = nums.length-2; i >=0; i--) {after[i] = after[i+1] * nums[i+1];}int[] res = new int[nums.length];for (int i = 0; i < nums.length; i++) {res[i] = pre[i] * after[i];}return res;}
}

7.缺失的第一个正数

考察交换元素
把数字3放到下标为2的数组中
nums[i] = nums[nums[i]-1]

class Solution {public int firstMissingPositive(int[] nums) {// 3在下标为2的地方for (int i = 0; i < nums.length; i++) {while (nums[i] > 0 && nums[i] <= nums.length && nums[i] != nums[nums[i]-1]) {int temp = nums[nums[i]-1];nums[nums[i]-1] = nums[i];nums[i] = temp;}}for (int i = 0; i < nums.length; i++) {if (nums[i] != i+1) {return i + 1;}}return nums.length+1;}
}

8.矩阵置零

考察矩阵
0行和零列需要单独处理

class Solution {public void setZeroes(int[][] matrix) {int m = matrix.length;int n = matrix[0].length;boolean rowZero = false;boolean colZero = false;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (matrix[i][j] == 0) {matrix[i][0] = 0;matrix[0][j] = 0;// 必须放在这里,否则会受到上述两行的干扰if (i == 0) rowZero = true;if (j == 0) colZero = true;}}}// 处理非零行和列for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (matrix[i][0] == 0 || matrix[0][j] == 0) {matrix[i][j] = 0;}}}if (rowZero == true) {for (int i = 0; i < n; i++) {matrix[0][i] = 0;}}if (colZero == true) {for (int i = 0; i < m; i++) {matrix[i][0] = 0;}}}
}

9.螺旋矩阵

考察矩阵边界
注意结束一次循环就要立马判断

class Solution {public List<Integer> spiralOrder(int[][] matrix) {int m = matrix.length;int n = matrix[0].length;List<Integer> res = new ArrayList<>();int left = 0, right = n-1, top = 0, bottom = m-1;while (true) {if (left > right || top > bottom) {break;}for (int i = left; i <= right; i++) {res.add(matrix[top][i]);}if (++top > bottom) break;for (int i = top; i <= bottom; i++) {res.add(matrix[i][right]);}if (--right < left) break;for (int i = right; i >= left; i--) {res.add(matrix[bottom][i]);}if (--bottom < top) break;for (int i = bottom; i >= top; i--) {res.add(matrix[i][left]);}if (++left > right) break;}return res;}
}

10.旋转图像

考察矩阵旋转90°=对角线翻转+中线翻转

class Solution {public void rotate(int[][] matrix) {// 对角线翻转+中线翻转=顺时针旋转90°int m = matrix.length;int n = matrix[0].length;for (int i = 0; i < m; i++) {for (int j = 0; j < i; j++) {int temp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = temp; }}for (int i = 0; i < m; i++) {for (int j = 0; j < n / 2; j++) {int temp = matrix[i][j];matrix[i][j] = matrix[i][n-j-1];matrix[i][n-j-1] = temp;}}}
}
http://www.dtcms.com/a/434596.html

相关文章:

  • IDEA自动构建与热部署配置
  • 国庆day2
  • Mac添加全局变量
  • 东方美学融合真空保鲜技术,海信璀璨真空头等舱650冰箱发布
  • 网站设计风格分析牡丹江到林口火车时刻表
  • 【操作系统】外存到cpu数据流动路径
  • logits和softmax分布
  • 硬件工程师入门基础知识(九)压敏电阻
  • [Linux]学习笔记系列 -- lib/xarray.c eXtensible Array (XArray) 可扩展数组
  • 基于物理信息神经网络(PINN)求解二维稳态对流-扩散方程的MATLAB实现
  • 物流网站建设可行性分析品牌网站制作网站公司
  • 温州专业微网站制作网络公司建设125摩托车价格及图片
  • 《嵌入式 – GD32开发实战指南(RISC-V版本)》第5章 跳动的心脏-内核TIMER
  • 《嵌入式 – GD32开发实战指南(RISC-V版本)》第7章 定时器
  • 佛山新网站建设平台专业动画制作软件
  • 《WebAssembly指南》第九章:WebAssembly 导入全局字符串常量
  • ​​轻量之选:不依赖宝塔,用 NPM 与命令行部署在线工具箱​
  • RUST 静态生命周期和动态生命周期
  • Rocky Linux 8 远程管理配置指南(宿主机 VNC + KVM 虚拟机 VNC)
  • 北京网站快速备案建站手机网站
  • 第四章 信息系统管理
  • 【开发日记】记一次公司服务器中Redis服务问题排查
  • linux问题10--克隆后ip地址和源linux主机相同
  • 社交网站模版steam交易链接怎么改
  • AI重塑销售管理,突破“人”的能力边界|纷享AI主题研讨会宁波站圆满落幕
  • [C++项目组件] 后台服务器部署docker
  • 移动固态优盘坏道读写速率下降等测试
  • 解决django.db.utils.OperationalError: attempt to write a readonly database问题
  • Django SimpleUI 配置与优化详解
  • 从入门到精通:Django的深度探索之旅