LeetCode 热题 HOT 100(P21~P30)

 系列文章: 

LeetCode 热题 HOT 100(P1~P10)-CSDN博客

LeetCode 热题 HOT 100(P11~P20)-CSDN博客

LeetCode 热题 HOT 100(P21~P30)-CSDN博客

LC48rotate_image

. - 力扣(LeetCode)

题目:

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

解法:

也是套路题,乍一看完全没思路,旋转到底要怎么弄?实际的解法是把旋转变成翻转的组合,比如这里顺时针旋转90度,相当于先上下翻转,再沿对角线翻转,针对翻转的代码就比较好写了。
 public void rotate(int[][] matrix) {final int row = matrix.length;final int col = matrix[0].length;//上下翻转for (int i = 0; i < row / 2; i++) {for (int j = 0; j < col; j++) {swap(matrix, i, j, row - i - 1, j);}}//对角线翻转for (int i = 0; i < row; i++) {for (int j = i + 1; j < col; j++) {swap(matrix, i, j, j, i);}}}private void swap(int[][] matrix, int rowIndex, int colIndex, int newRowIndex, int newColIndex) {int tmp = matrix[rowIndex][colIndex];matrix[rowIndex][colIndex] = matrix[newRowIndex][newColIndex];matrix[newRowIndex][newColIndex] = tmp;}

LC49group_anagrams

. - 力扣(LeetCode)

题目:

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

解法:

理解题目的意思有点费劲,实际就是由相同字母组成单词的集合,很自然的想到用HashMap 。

 public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> cache = new HashMap<>();for (String str : strs) {final char[] chars = str.toCharArray();Arrays.sort(chars);cache.computeIfAbsent(new String(chars), (k) -> new ArrayList<String>()).add(str);}return new ArrayList<>(cache.values());}

写出代码不难,关键是能否写的尽量简练。

LC53maximum_subarray

. - 力扣(LeetCode)

题目:

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组是数组中的一个连续部分。

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

解法:

一般这种最*** 的题目理论上都可以用动态规划,核心难点是动态数组的定义,很多时候动态数组定义好了,动态推导方程也能比较简单的推演出来。

动态数组:dp[i] 表示包含下标i的连续子数组最大和

动态方程:dp[i] = Max(i,dp[i-1]+i) 

比较好理解的,这里稍微解释下包含i的数组最大和,基本要看前一位最大和是否小于0,如果是负数带上前面的肯定更小,还不如自己玩(i),如果前面大于0,那么带上肯定更大。

public int maxSubArray(int[] nums) {int[] dp = new int[nums.length];dp[0] = nums[0];int max = dp[0];for (int i = 1; i < nums.length; i++) {dp[i] = Math.max(nums[i], dp[i - 1] + nums[i]);max = Math.max(max, dp[i]);}return max;}

因为i只跟i-1 有关,因此动态数组可以简化为单个变量,其实动态规划很多代码都可以简化为单个或多个变量,但是这样的话代码就不太好理解。

LC55jump_game

. - 力扣(LeetCode)

题目:

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

解法:

可能也算套路题,有思路之后很简单。其实就是每跳一步就记录当前能跳到的最远位置,然后一个个位置跳过去,判断当前记录最远位置能否到下一个。实际上也是动态规划的思路。

动态数组:dp[i] 表示在i位置时能跳到的最远下标

动态方程:dp[i] = max(dp[i-1],i+nums[i])

 public boolean canJump(int[] nums) {//表示能达到的最远距离int k = 0;for (int i = 0; i < nums.length; i++) {if (k < i) {return false;}k = Math.max(k, i + nums[i]);}//能抵达最后一块石头就okreturn true;}

这里将动态数组精简为单个变量。

LC56merge_intervals

. - 力扣(LeetCode)

题目:

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

解法:

区间合并的问题,首先是排序,按照starti 排序。然后就是进行入队操作,在入队的时候跟队首元素进行比较,看下当前元素starti 是否大于队首元素的endi,如果大于说明需要开一个新的区间,如果小于那就加入当前区间。

public int[][] merge(int[][] intervals) {// 先按照区间起始位置排序Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);// 遍历区间List<int[]> result = new ArrayList<>();for (int[] interval : intervals) {// 如果结果数组是空的,或者当前区间的起始位置 > 结果数组中最后区间的终止位置,// 则不合并,直接将当前区间加入结果数组。if (result.isEmpty() || interval[0] > result.get(result.size() - 1)[1]) {result.add(interval);} else {final int[] ints = result.get(result.size() - 1);ints[1] = Math.max(ints[1], interval[1]);}}return result.toArray(new int[0][]);}

注意合并的写法,需要取当前元素的endi 和队首元素的endi 的最大值,在这里踩过坑。

LC62unique_paths

. - 力扣(LeetCode)

题目:

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

解法:

因为每次只能向下或者向右移动一步,因此要走到右下角,上一步只能从下面下来,或者从左边过来。对每个位置来说也可以这么推断,这里动态数组定义比较直观dp[i,j] 就是走到坐标[i,j] 一共有多少路径。动态方程dp[i,j] = dp[i-1,j] + dp[i,j-1]  。这里还涉及到动态数组的初始化,第一列和第一排的走法只有1种。

 public int uniquePaths(int m, int n) {int[][] dp = new int[m][n];//初始化行列的情况for (int i = 0; i < m; i++) {dp[i][0] = 1;}for (int i = 0; i < n; i++) {dp[0][i] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}

LC64minimum_path

. - 力扣(LeetCode)

题目:

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

解法:

这道题跟上一道类似,不同的是这里求最小和,其实走法是一样的,因为只能从上面或者左边过来。动态数组定义为当前位置的最小值,动态方程有所调整,dp[i,j]=min(dp[i-1,j],dp[j,i-1]) +nums[i,j] 。 

 public int minPathSum(int[][] grid) {final int m = grid.length, n = grid[0].length;int[][] dp = new int[m][n];dp[0][0] = grid[0][0];for (int i = 1; i < m; i++) {dp[i][0] = grid[i][0] + dp[i - 1][0];}for (int i = 1; i < n; i++) {dp[0][i] = grid[0][i] + dp[0][i - 1];}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];}}return dp[m - 1][n - 1];}

这里有个优化,可以不用新增动态数组dp ,直接在原数组grid 上直接操作,这样能节省内存开销。

LC70climbing_stairs

. - 力扣(LeetCode)

题目:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

解法:

经典的爬楼梯算法题,他可以用递归的方式,也可以使用动态规划的思路。这类题目乍一看没思路,实际跟上面机器人走路是一样,要么从前1个台阶过来,要么从前2个台阶过来。动态方程比较简单:dp[i] = dp[i-1]+dp[i-2] 。因为只涉及前2个值,可以用2个变量替代数组。

public int climbStairs(int n) {if (n < 3) {return n;}int one = 1;int two = 2;for (int i = 3; i <= n; i++) {int cur = one + two;one = two;two = cur;}return two;}

LC72edit_distance

. - 力扣(LeetCode)

题目:

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数  。

你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

解法:

差不多也是套路题,这道题目跟机器走路的思路类似,可以参考下面的图

dp[i][j] 表示wrod1 的前 i 个字符转换成word2 的前j个字段所用的最小操作数 。相当于求最后一个格子的值。有点复杂的地方在于第一行和第一列作为空串进行初始化,第一行的意思是空串 ‘’ 变成'ros'  所需的最小步骤。第一列同理,这样就初始化好了动态数组。这里的动态方程有点复杂,需要分情况判断:

  • 当 word1[i] == word2[j],dp[i][j] = dp[i-1][j-1];
  • 当 word1[i] != word2[j],dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1 ;
    • dp[i-1][j-1] 表示替换操作
    • dp[i-1][j] 表示删除操作
    • dp[i][j-1] 表示插入操作。
public int minDistance(String word1, String word2) {final int row = word1.length();final int col = word2.length();// 因为有初始行和初始列,所以这里长度+1int[][] dp = new int[row + 1][col + 1];for (int i = 0; i <= row; i++) {dp[i][0] = i;}for (int i = 0; i <= col; i++) {dp[0][i] = i;}for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {if (word1.charAt(i) == word2.charAt(j)) {dp[i + 1][j + 1] = dp[i][j];} else {dp[i + 1][j + 1] = Math.min(Math.min(dp[i][j], dp[i][j + 1]), dp[i + 1][j]) + 1;}}}return dp[row][col];}

LC75sort_colors

. - 力扣(LeetCode)

题目:

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

解法:

套路题,需要了解思路。维护0,1,2的初始下标,其中0,1初始在0,2初始在len-1,然后迭代数组,对数组中的数字进行判断,并相应的移动下标。可以参考官方的讲解配图,比较好理解。

public void sortColors(int[] nums) {if (nums.length == 0) {return;}//定义几个下标,需要实现// all in [0, zero] = 0// all in (zero, i) = 1// all in (two, len - 1] = 2int zero = 0, cur = 0, two = nums.length - 1;while (cur <= two) {if (nums[cur] == 0) {swap(nums, zero, cur);zero++;cur++;} else if (nums[cur] == 1) {cur++;} else {swap(nums, cur, two);//注意 这个时候cur 不能移动,因为交换之后还要再判断下two--;}}}private void swap(int[] nums, int i, int j) {final int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文彻底搞懂Redis底层数据结构

文章目录 1. 数据结构与数据类型的关系2. 底层数据结构详解2.1 SDS: 简单动态字符串2.2 双端链表2.3 压缩列表2.4 哈希表2.5 整数集合2.6 跳表2.7 quicklist2.8 listpack 1. 数据结构与数据类型的关系 Redis是一个基于内存的数据存储系统&#xff0c;它支持多种数据结构和数据…

vue项目报这个错是 Same `value` exist in the tree: 0008E3000E1A?

警告 "Same value exist in the tree: 0008E3000E1A" 表示在树形选择器中存在相同的值。这通常是由于树形选择器的数据中存在重复的值造成的。就是返回的值中&#xff0c;有俩个id相同

基于K-近邻的PLOSAR图像分类

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

mybatis实践篇(二)

自定义类型处理器&#xff08;TypeHandler&#xff09; 实体 package com.wyl.mybatis.entity;import java.util.Date;/*** Description 省市区-字典* Author wuyilong* Date 2024-02-26*/public class FullCity {private static final long serialVersionUID 1L;/*** 主键I…

第十三届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 裁纸刀试题 B: 寻找整数试题 C : \mathrm{C}: C: 求和试题 D: GCD试题 E: 蜂巢试题 F : \mathrm{F}: F: 全排列的价值试题 G: 青蛙过河试题 H \mathrm{H} H : 因数平方和试题 I: 最优清零方案试题 J : \mathrm{J}: J: 推导部分和 发现…

Unity Mesh简化为Cube mesh

Mesh简化为Cube mesh &#x1f373;食用&#x1f959;子物体独立生成CubeMesh&#x1f96a;合并成一个CubeMesh&#x1f32d;Demo &#x1f373;食用 下载并导入插件&#x1f448;即可在代码中调用。 &#x1f959;子物体独立生成CubeMesh gameObject.ToCubeMesh_Invidual()…

Win11文件右键菜单栏完整显示教程

近日公司电脑升级了win11&#xff0c;发现了一个小麻烦事&#xff0c;如下图&#xff1a; 当我想使用svn或git的时候必须要多点一下&#xff0c;这忍不了&#xff0c;无形之中加大了工作量&#xff01; 于是&#xff0c;菜单全显示教程如下&#xff1a; 第一步&#xff1a;管…

C#宿舍信息管理系统

简介 功能 1.发布公告 2.地理信息与天气信息的弹窗 3.学生信息的增删改查 4.宿舍信息的增删改查 5.管理员信息的增删改查 6.学生对宿舍物品的报修与核实 7.学生提交请假与销假 8.管理员对保修的审批 9.管理员对请假的审批 技术 1.采用C#\Winform开发的C\S系统 2.采用MD5对数据…

Centos7安装Python3.8

1.安装编译相关工具 yum -y groupinstall "Development tools" yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel yum install libffi-devel -y2.下载安装包…

GPT模型部署后续:聊天机器人系统的扩展与优化

一、多轮对话支持 为了实现多轮对话支持&#xff0c;我们需要维护用户的会话上下文。这可以通过在服务器端使用一个字典来存储会话状态实现。 目录 一、多轮对话支持 下面是一个简单的扩展例子&#xff1a; 二、性能优化 三、用户界面与交互优化 下面是一个简单的HTML示例&…

一文搞懂 YOLOv9 训练推理全流程 | YOLOv9你绝对不知道的细节!

文章地址&#xff1a;https://arxiv.org/pdf/2402.13616.pdf 代码地址&#xff1a;https://github.com/WongKinYiu/yolov9 前言 在这篇博客中&#xff0c;我们来聊聊 YOLOv9。首先&#xff0c;值得注意的一点是&#xff0c;YOLOv9的变化相对较小&#xff0c;它仍然基于YOLOv5的…

微信小程序button动态跳转到页面

微信小程序中如何动态的跳转到某个页面。 目录 1、首先在js文件中定义事件函数 2、在页面中进行传参调用 3、其它跳转方法简单说明 1、首先在js文件中定义事件函数 goto(e){const urle.currentTarget.dataset.url;wx.navigateTo({url: url})}, 2、在页面中进行传参调用 &l…

【随笔】Git -- 常用命令(四)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

带你学会深度学习之循环神经网络[RNN] - 2

前言 笔者写下此系列文章是希望在复习人工智能相关知识同时为想学此技术的人提供一定帮助。 图源网络&#xff0c;所有者可随时联系笔者删除。 代码不代表全部实现&#xff0c;只是为展示模型的关键结构。 与CNN不同&#xff0c;RNN被设计用来处理序列数据。它通过在网络的…

3GPP 协议资料学习和文档下载

一、登录3GPP官网 3GPP – The Mobile Broadband Standard 二、选择Specifications Per TSG Round 三、选择ftp下载路径 四、选择不同阶段的3GPP协议 包含了从1999年到R18,甚至更新到当前最新的协议。 五、查看对应版本的LTE或者5G NR协议 其中LTE射频相关章节为36.521系列&…

小目标检测篇 | YOLOv8改进之增加小目标检测层(针对Neck网络为AFPN)

前言:Hello大家好,我是小哥谈。小目标检测是计算机视觉领域中的一个研究方向,旨在从图像或视频中准确地检测和定位尺寸较小的目标物体。相比于常规目标检测任务,小目标检测更具挑战性,因为小目标通常具有低分辨率、低对比度和模糊等特点,容易被背景干扰或遮挡。本篇文章就…

MP4如何把视频转MOV格式? MP4视频转MOV格式的技巧

在现代的数字媒体时代&#xff0c;视频格式转换成为了许多用户必须掌握的技能。特别是将MP4视频转换为MOV格式&#xff0c;这对于需要在Apple设备上播放或编辑视频的用户来说尤为重要。本文将详细介绍如何将MP4视频转换为MOV格式&#xff0c;帮助读者轻松应对不同设备和平台的需…

三端可调正稳压器集成电路D317——输出电压范围是1.2V至37V,负载电流最大为1.5A

D317大电流可调稳压电路 1、 概述&#xff1a; D317是一款三端可调正稳压器集成电路&#xff0c;其输出电压范围是1.2V至37V&#xff0c;负载电流最大为1.5A。它的使用非常简单&#xff0c;仅需两个外接电阻来设置输出电压。此外&#xff0c;它的电压线性度和负载调整率也比标准…

使用Python制作一个批量查询搜索排名的SEO免费工具

搭建背景 最近工作中需要用上 Google SEO&#xff08;搜索引擎优化&#xff09;&#xff0c;有了解过的朋友们应该都知道SEO必不可少的工作之一就是查询关键词的搜索排名。关键词少的时候可以一个一个去查没什么问题&#xff0c;但是到了后期&#xff0c;一个网站都有几百上千…

浏览器工作原理与实践--渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的

在上一篇文章中我们介绍了导航相关的流程&#xff0c;那导航被提交后又会怎么样呢&#xff1f;就进入了渲染阶段。这个阶段很重要&#xff0c;了解其相关流程能让你“看透”页面是如何工作的&#xff0c;有了这些知识&#xff0c;你可以解决一系列相关的问题&#xff0c;比如能…