leetcode hot100

哈希

49.字母异位词分组
HashMap的含义比较晕,可以重做

双指针

11.盛最多水的容器
双指针的起始位置和移动条件没转过来,可以重做

15.三数之和
不太熟练,可以再做一遍

42.接雨水
还可以用dp和单调栈做
双指针法:
首先需要注意的就是一个规律,从左到右,最大高度逐渐递增leftMax,从右到左,最大高度逐渐递增rightMax。

height010210132121
leftMax001122223333
rightMax333333322210

所以每次比较的时候只需要比较leftMax和rightMax。
比如当遍历到下标2时,leftMax=1,虽然暂时不知道右边墙多高,但是右边的墙肯定大于等于现在的rightMax,所以只要leftMax<rightMax,这个地方就可以存水,高度为height[left],水量为leftMax-height[left]。

滑动窗口

438.找到字符串中所有字母异位词
这题HashMap超时
可以用数组存字母及其数量,使用Arrays.equals(a, b)进行对数组对比

子串

560.和为K的子数组
不可以根据当前窗口是否大于target就移动,因为有负数
创建前缀和pre,HashMap的key存前缀和,value存该前缀和的出现的次数
重点:
pre[i] = pre[i-1] + nums[i]
i~j符合条件:pre[i] = pre[j-1] + k 即 pre[j-1] = pre[i] - k
所以计数条件是map.containsKey(pre - k),证明有一个符合,cnt++
注意:
map.put(0, 1)初始化,因为前缀pre=k也算一个
return cnt;

239.滑动窗口最大值
用队列解决,保证队首是最大值,保证队第二位往后越来越小,如果大于队尾就把队尾弹出
让下标入队,便于检测是否离开滑动窗口

76.最小覆盖子串
做的有点磕磕绊绊,容易超时,注意hashmap的使用

普通数组

56.合并区间
二维数组排序用Arrays.sort
注意最后一次start和end的处理
一个区间的数组单独处理
list.toArray可以把list转化为数组

189.轮转数组
注意k>nums.length的处理
可以用逆序数组操作得到

41.缺失的第一个正数
除了可以用Arrays.sort之外还有一个方法
缺失的正数一定在[1, nums.length]之间
第一轮循环,先把负数和0变成nums.length+1,打标记
第二轮循环,选择值x为1~nums.length之间的,将此数作为下标,将nums[x-1]变成负的,打标记
第三轮循环,选择第一个值大于0的,返回其下标index+1
太巧妙了
在这里插入图片描述

矩阵

48.旋转图像
做的老费劲了,还好做出来了
用一个变量存数,完成一圈四个数字的转换

240.搜索二维矩阵II
有个坑
不要沿着对角线判断,因为下一行的第一个可能比上一行的最后一个小,比如
{1, 10}
{2, 11}
{3, 12}
{4, 13}
可以对每一行使用二分查找

链表

142.环形链表II
注意交叉点不是快慢指针相遇的点,是相遇点指针和头节点指针共同前进相遇的点

138.随机链表的复制
可以用map来解决,键是原list的节点,值是新list的节点,只有map里没有原node对应的新node时,创建新节点,把新节点加入map,并递归创建next和random,最后将创建的新节点返回,完成当前节点的赋值。

148.排序链表
给链表排序,比较难,可以重做。
对链表自顶向下归并排序

  • 找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以使用快慢指针的做法,快指针每次移动2步,慢指针每次移动1步,当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点。
  • 对两个子链表分别排序。
  • 将两个排序后的子链表合并,得到完整的排序后的链表。

可以使用递归的方式,拆分排序作为一个方法递归,调用合并方法进行合并。

146.LRU缓存
创建一个新类,可以用双向链表记录缓存key和value,然后用HashMap提供key和node的对应关系,设置头尾节点方便对首尾进行操作。

二叉树

226.翻转二叉树
需要先交换左右节点,然后再递归左右,不能直接交换左子树和右子树

101.对称二叉树
可以用队列辅助求解,每次进对应该相等的节点

543.二叉树的直径
最长的也就是两条最深的路径相加,路径长=经过的节点-1,可以利用求深度的函数,每次更新ans为左右深度相加最大值。

98.验证二叉搜索树
注意:二叉搜索树中序是递增有序序列
记得维护一个maxNode记录当前最大值,比较当前节点与当前最大值,必须当前更大才能继续,不然false

230.二叉搜索树中第k小的元素
能想到中序遍历,但是递归不好做,要用迭代中序遍历
迭代:用栈模拟递归,中序进栈是左-中-右

105.从前序与中序遍历
有意思,可以重做

437.路径总和III
穷举,访问一个node节点,检测以node为起始节点往下延伸的路径有多少种,递归遍历每一个节点开始所有可能的路径,然后把路径相加。
定义新函数,计算以node为起始节点的符合要求的路径数
可以重做

236.二叉树的最近公共祖先
后序遍历之后回溯
如果左右都搜到,返回root
左有右无,返回左,反之亦然,这里是这个节点是祖先但是不是最近,因此要返回给上层
左无右无,返回null
重做

124.二叉树中的最大子树和
这题有点复杂
可以创建一个方法计算最大子树和
返回值:node+node.left或node+node.right的最大值,作为结果路径的一部分
先计算left和right的方法返回值,注意返回值和0取最大值,负数直接不考虑
最大子树和全局变量二者取最大:左根右/原来的最大值
注意:maxSum作为全局变量计算,不需要用方法返回值,方法返回的是目前一条线的路径和
重做

回溯

79.单词搜索
这题有点绕
因为可以从任意一点开始
需要二维数组标记本次序列中的visited
结束条件:当前字母不匹配,false;当前是word最后一个字母且匹配,true;
其他情况再标记visited,不可以在之前就标记
可以用二维数组表示行动路线上下左右

二分查找

33.搜索旋转排序数组
虽然前后颠倒,但是仍然可以用二分查找
mid左右两侧肯定有一边是有序的
所以分支可以按照以下判断:
nums[0] < nums[mid]:左侧有序,看target值和nums[mid]的大小
else:nums[mid] < nums[nums.length()-1]:右侧有序,看target值和nums[mid]的大小
在这里插入图片描述
153.寻找旋转排序数组中的最小值
注意结束条件:区间长度为1,且不存在mid和high位置的数字相等的情况
如果右侧有序:移动high到mid
else:low = mid + 1

贪心

45.跳跃游戏II
增加步数的时机:当前再跳就到末尾;当前位置为当前覆盖的最大区域
更新当前范围的时机:走到当前区域的最后一个位置
更新最大范围的时机:每一次循环都更新最大范围

763.划分字母区间
解题方式比较有意思,可以用数组记录字母的最后出现时间,检查当前是不是已经到maxIndex,不算严格的贪心

动态规划

279.完全平方数
完全背包问题
背包:n;物品:每个组成完全平方的数
可以重做

322.零钱兑换
可以先遍历硬币种类,再遍历数值,递推公式:dp[j] = Math.min(dp[j-coins[i]]+1, dp[j])

139.单词拆分
用set装list里的单词,用i和j表示子串的起始位置
如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )。
所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。

300.最长递增子序列
位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。
所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);(j在0~i的循环中)

152.乘积的最大子数和
这题不能用之前的根据前一个的乘积推,因为如果两个负数相乘就会变成正数
可以理解为记录最大数和最小数,递推公式:

maxF[i] = Math.max(maxF[i-1]*nums[i], Math.max(nums[i], minF[i-1] * nums[i]));
minF[i] = Math.min(minF[i-1]*nums[i], Math.min(nums[i], maxF[i-1] * nums[i]));

minF[i-1] * nums[i]最大的情况是(-5)(-2)这种
maxF[i-1] * nums[i]最大的情况是5
(-2)这种

416.分割等和子集
01背包问题

32.最长有效括号

  • 如果本字符是),前一个是(,那么可以是dp[i-1]+2
  • 如果本字符是),前一个不是(,i-dp[i-1]-1是(,那么可以是dp[i-1]+dp[i-dp[i-1]-2]+2,前者代表前一位的连续长度,后者代表前一段再往前如果对应,那么加上前面的连续长度,例如()((())),dp[6]=4,发现第7位减掉前面连续的4之后对应的是(,可以在此基础上加2,再加上前面的dp[1]的连续长度

5.最长回文子串
可以这样理解:
先遍历子串长度,再遍历起始位置,根据子串长度和起始位置得到终止位置,判断双端是否相等
dp可以表示这一段是否是回文,用maxLen记录最长长度

72.编辑距离
dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]
重做

84.柱状图中最大的矩形
单调栈的经典题目
找低-高-低进行计算
可以重做

技巧

31.下一个排列
可以使用以下思路:

  1. 设置变量i为len-2,jk为len-1
  2. 从后往前找一个相邻升序的元素对,满足Ai<Aj,此时j到end肯定是降序
  3. 在j到end从后向前找一个满足Ai<Ak的k
  4. 将Ai与Ak交换
  5. 这时候j到end肯定是降序,逆序j到end让它升序
  6. 如果2中找不到相邻元素对,证明现在整个序列都是降序,那就直接跳到4

207.课程表
其实是dfs拓扑排序,如果有环则false
可以设置节点的不同状态:正在访问、已访问、未访问
从未访问节点开始dfs,如果发现该点的对应节点也是正在访问,则false
需要注意:如果List<List<>>已经初始化内部ArrayList,就算是空的,get也不会报错。
ArrayList中,add方法不会覆盖原值,而是将新值添加到列表的末尾。因此,调用edges.get(edge[1]).add(edge[0]);不会覆盖任何已有的值,而是将edge[0]追加到edges.get(edge[1])返回的列表的末尾。

208.前缀树
这和图有什么关系
这题前缀树可以理解为字符串前缀每一个字符都占一层,Trie[] children; // 指向子节点的指针数组,boolean isEnd; // 是不是字符串的结尾
孩子children[0]表示a,然后进行查找插入等操作

215.数组中的第K大元素
快排超时
使用堆排序
需要注意:
建堆的过程和堆排序过程类似,建堆从1/2节点处逆序开始,1/2即最后一个父节点,比较父子节点是否需要交换。
堆排序的过程需要先交换堆顶即0和最后未排序的数字,然后对剩余未排序数组进行排序。
重做

347.前k个高频元素
可以用堆和优先队列,用hashmap统计出现次数后,遍历hashmap,如果队列未满入队
如果队列已满,比较队首元素,如果当前count更多就弹出加入当前count

PriorityQueue<int[]> queue = new PriorityQueue<int[]>((o1, o2) -> o1[1]-o2[1]);

是小顶堆,按照升序排序,每次出队的是最小值

295.数据流的中位数
由于是数据流,考虑变动的情况
可以设置两个优先队列分别表示小于中位数和大于中位数的情况
保证两个队列大小相等或一方大1位数
小于中位数的队列队首为最大值,大于中位数的队列队首为最小值

完结撒花***

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

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

相关文章

【DFS(深度优先搜索)详解】看这一篇就够啦

【DFS详解】看这一篇就够啦 &#x1f343;1. 算法思想&#x1f343;2. 三种枚举方式&#x1f343;2.1 指数型枚举&#x1f343;2.2 排列型枚举&#x1f343;2.3 组合型枚举 &#x1f343;3. 剪枝优化&#x1f343;4. 图的搜索&#x1f343;5. 来几道题试试手&#x1f343;5.1 选…

spark任务,使用 repartition 对数据进行了重新分区,但任务输入数据大小仍存在不均衡

目录 目录 确认 Spark 任务重新分区后的数据不均衡 1. 检查分区大小 2. 使用 DataFrame API 检查分区 3. 使用 Spark UI 查看分区情况 4. 使用日志记录分区信息 可能原因 1. 数据分布不均衡 2. 分区策略 3. 数据预处理 解决方案 1. 检查数据分布 2. 使用 coalesce…

代码随想录算法训练营Day62|冗余连接、冗余连接II

冗余连接 108. 冗余连接 (kamacoder.com) 考虑使用并查集&#xff0c;逐次将s、t加入并查集中&#xff0c;当发现并查集中find(u)和find(v)相同时&#xff0c;输出u和v&#xff0c;表示删除的边即可。 #include <iostream> #include <vector> using namespace s…

【分布式系统】注册中心Zookeeper

目录 一.Zookkeeper 概述 1.Zookkeeper 定义 2.Zookkeeper 工作机制 3.Zookkeeper 特点 4.Zookkeeper 数据结构 5.Zookkeeper 应用场景 统一命名服务 统一配置管理 统一集群管理 服务器动态上下线 软负载均衡 6.Zookkeeper 选举机制 第一次启动选举机制 非第一次…

uboot镜像之boot烧写

适用场景:单板上没有boot&#xff0c;和按地址烧写配合&#xff0c;可完成单板所有镜像的烧写。 原理:bootrom读取u-boot.bin至内存并执行此u-boot 然后运行uboot,通过uboot sf命令烧录uboot.bin到flash存储空间去. bootrom读取u-boot.bin至内存并执行此u-boot 通过uboot sf命…

【开发工具】webStrom2024版-插件

Chinese (Simplified) Language Pack / 中文语言包 英文界面变为中文界面。 Material Theme UI 界面美化 Rainbow Brackets 代码量变大时&#xff0c;总会伴随着各种括号&#xff1b;它能将括号赋予不同的颜色&#xff0c;方便我们区分。 Translation 中英互译&#xff0c;…

Codeforces Round 918 (Div. 4)(A~F)

目录 A. Odd One Out B. Not Quite Latin Square C. Can I Square? D. Unnatural Language Processing E. Romantic Glasses F. Greetings A. Odd One Out Problem - A - Codeforces 输出一个不同于其他两个数的数&#xff0c;用异或操作可以轻松解决。 void solve{int…

高考志愿填报,选专业是看兴趣还是看就业?

对于结束高考的学生来说&#xff0c;选择专业的确是一个非常让人头疼的事情。因为很多人都不知道&#xff0c;选专业的时候究竟是应该看一下个人兴趣&#xff0c;还是看未来的就业方向&#xff0c;这也是让不少人都相当纠结的问题。这里分析一下关于专业选择的问题&#xff0c;…

windows下docker安装

目录 前言 1.搭建WSL2环境 1.1打开控制面板 1.2 将WSL 2设置为默认值 2.安装docker 3.使用docker 结论&#xff1a; 前言 本文安装docker&#xff0c;将使用WSL2&#xff0c;而不是vmeare和Hyper-V&#xff0c;也不需要你另外安装Linux系统&#xff08;如Ubuntu&#x…

PostgreSQL主从同步

目录 一、主从复制原理 二、配置主数据库 2.1 创建同步账号 2.2 配置同步账号访问控制 2.3 设置同步参数 3.4 重启主数据库 三、配置从数据库 3.1 停止从库 3.2 清空从库数据文件 3.3 拉取主库数据文件 3.4 配置从库同步参数 3.5 启动从库 四、测试主从 4.1在主库…

【HTML入门】第四课 - 换行、分割横线和html的注释

这一小节&#xff0c;我们继续说HTML的入门知识&#xff0c;包括换行、横线分割以及注释&#xff08;html的注释&#xff09;。 目录 1 换行 2 分割横线 3 html注释 1 换行 html中分为块元素和行内元素。这一小节呢&#xff0c;先不说这些元素们&#xff0c;我们先说一下换…

免费分享:1981-2016全球粮食产量数据集(附下载方法)

了解主要作物的历史产量模式&#xff0c;包括趋势和年际变化&#xff0c;对于了解在粮食需求和气候变化日益增长的情况下粮食生产的现状、潜力和风险至关重要。 数据简介 1981-2016全球粮食产量数据集是农业普查统计&#xff08;粮农组织报告的国家产量统计数据&#xff09;和…

云渲染平台那个好?2024云渲染测评

1.渲染100&#xff08;强烈推荐&#xff09; 以高性价比著称&#xff0c;是预算有限的小伙伴首选。 15分钟0.2,60分钟内0.8;注册填邀请码【5858】可领30元礼包和免费渲染券) 提供了多种机器配置选择(可以自行匹配环境)最高256G大内存机器&#xff0c;满足不同用户需求。支持…

GDBFuzz:基于硬件断点的嵌入式系统模糊测试工具

关于GDBFuzz GDBFuzz是一款功能强大的模糊测试工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以使用硬件断点对嵌入式系统进行模糊测试。 GDBFuzz的理念是利用微控制器的硬件断点作为覆盖引导模糊测试的反馈。因此&#xff0c;GDB被用作通用接口以实现广泛的适用…

Java异常详解及自定义异常

认识异常&#xff0c;掌握异常处理主要的5个关键字&#xff1a;throw、try、catch、final、throws并掌握自定义异常 目录 1、异常概念与体系结构 1、1异常的概念 1、2异常体系结构 1、3异常的分类 编译时异常&#xff1a; 运行时异常 &#xff1a; 2、异常处理 2、1防御式…

如何确保 PostgreSQL 在高并发写操作场景下的数据完整性?

文章目录 一、理解数据完整性二、高并发写操作带来的挑战三、解决方案&#xff08;一&#xff09;使用合适的事务隔离级别&#xff08;二&#xff09;使用合适的锁机制&#xff08;三&#xff09;处理死锁&#xff08;四&#xff09;使用索引和约束&#xff08;五&#xff09;批…

【C++】类和对象(中)--下篇

个人主页~ 类和对象上 类和对象中-上篇 类和对象 五、赋值运算符重载1、运算符重载2、赋值运算符重载3、前置和后置重载 六、const成员七、日期类的实现Date.hDate.cpptest.cpptest1测试结果test2测试结果test3测试结果test4测试结果test5测试结果test6测试结果test7测试结果 八…

SAP FICO自定义权限对象及自定义作业创建

设置的通用说明 要求设置税收分组权限&#xff0c;自定义权限对象&#xff1a;Z_SSFZ 执行按钮权限控制&#xff1a;权限对象Z_SSFZ 字段名&#xff1a;ZSSFZ对应维护税收分组 字段名&#xff1a;ZACTVT01 01&#xff1a;付款银行信息维护 02&#xff1a;员工基本信息维护…

知识图谱驱动的深度推理:ToG算法的创新与应用

LLMs通过预训练技术在大量文本语料库上生成连贯且符合上下文的响应。然而&#xff0c;面对需要复杂知识推理的任务时&#xff0c;它们存在明显的局限性。这些问题包括对超出预训练阶段的专业知识的准确回答失败&#xff0c;以及缺乏责任性、可解释性和透明度。为了解决这些问题…

伦敦银交易平台价格的突破成不成功?这点很重要!

在伦敦银交易中&#xff0c;当银价出现突破的时候&#xff0c;也正是引起很多投资者关注的时候。一旦银价出现突破&#xff0c;很可能是新行情的开端。但是做过突破交易&#xff0c;有相关经验的朋友会发现&#xff0c;自己在伦敦银交易平台做突破的时候&#xff0c;也并不是每…