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位数
小于中位数的队列队首为最大值,大于中位数的队列队首为最小值

完结撒花***

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux-多线程

线程的概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行&#xff0c;本质是在进程地址空间内运行在Linux系统中&#xff0c;在CPU眼中…

人话学Python-基础篇-字符串

一&#xff1a;字符串的定义 在Python中使用引号来定义。不论是单引号还是双引号。 str1 Hello World str2 "Hello World" 二&#xff1a;字符串的访问 如果我们要取出字符串中单独的字符&#xff0c;需要使用方括号来表示取得的位置。如果要取出字符串的子串&…

代理详解之静态代理、动态代理、SpringAOP实现

1、代理介绍 代理是指一个对象A通过持有另一个对象B&#xff0c;可以具有B同样的行为的模式。为了对外开放协议&#xff0c;B往往实现了一个接口&#xff0c;A也会去实现接口。但是B是“真正”实现类&#xff0c;A则比较“虚”&#xff0c;他借用了B的方法去实现接口的方法。A…

救生拉网的使用方法及注意事项_鼎跃安全

水域救援在夏季尤为重要&#xff0c;随着气温的升高&#xff0c;人们更倾向于参与水上活动&#xff0c;如游泳、划船、垂钓等&#xff0c;这些活动虽然带来了乐趣和清凉&#xff0c;但同时也增加了水域安全事故的风险。救生拉网作为水域安全的重要工具之一&#xff0c;其重要性…

ProFuzzBench入门教学——使用(Ubuntu22.04)

ProFuzzBench是网络协议状态模糊测试的基准测试。它包括一套用于流行协议&#xff08;例如 TLS、SSH、SMTP、FTP、SIP&#xff09;的代表性开源网络服务器&#xff0c;以及用于自动执行实验的工具。详细参考&#xff1a;阅读笔记——《ProFuzzBench: A Benchmark for Stateful …

Thinking--在应用中添加动态水印,且不可删除

Thinking系列&#xff0c;旨在利用10分钟的时间传达一种可落地的编程思想。 水印是一种用于保护版权和识别内容的技术&#xff0c;通常用于图像、视频或文档中。它可以是文本、图像或两者的组合&#xff0c;通常半透明或以某种方式嵌入到内容中&#xff0c;使其不易被移除或篡改…

非营利组织的数据治理之路

在非营利组织的日常运营中&#xff0c;数据不仅是记录过去活动的工具&#xff0c;更是指导未来决策、衡量项目成效、增强公众信任以及优化资源配置的关键要素。 然而&#xff0c;随着数据量的不断增长和复杂性的提升&#xff0c;非营利组织在享受数据带来的便利的同时&#xf…

文件操作和IO流

前言&#x1f440;~ 上一章我们介绍了多线程进阶的相关内容&#xff0c;今天来介绍使用java代码对文件的一些操作 文件&#xff08;file&#xff09; 文件路径&#xff08;Path&#xff09; 文件类型 文件操作 文件系统操作&#xff08;File类&#xff09; 文件内容的读…

一、openGauss详细安装教程

一、openGauss详细安装教程 一、安装环境二、下载三、安装1.创建omm用户2.授权omm安装目录3.安装4.验证是否安装成功5.配置gc_ctl命令 四、配置远程访问1.配置pg_hba.conf2.配置postgresql.conf3.重启 五、创建用户及数据库 一、安装环境 Centos7.9 x86openGauss 5.0.1 企业版…

我的FPGA

1.安装quartus 2.更新usb blaster驱动 3.新建工程 1.随便找一个文件夹&#xff0c;里面新建demo文件夹&#xff0c;表示一个个工程 在demo文件夹里面&#xff0c;新建src&#xff08;源码&#xff09;&#xff0c;prj&#xff08;项目&#xff09;&#xff0c;doc&#xff…

RedHat Linux8 修改root管理员账户密码命令

RedHat Linux8 修改root管理员账户密码命令&#xff1a; sudo passwd root RedHat重置root管理员密码&#xff1a; 1. 查看Linux系统版本信息 cat /etc/redhat-release2. 重置密码 2.1 进入内核编辑界面 重启Linux系统并出现引导界面&#xff0c;按下键盘上的e键进入内…

数据结构双向循环链表

主程序 #include "fun.h" int main(int argc, const char *argv[]) { double_p Hcreate_head(); insert_head(H,10); insert_head(H,20); insert_head(H,30); insert_head(H,40); insert_tail(H,50); show_link(H); del_tail(H); …

阈值分割后配合Connection算子和箭头工具快速知道区域的ID并选择指定区域

代码 dev_close_window () read_image (Image, E:/机器视觉学习/海康视觉平台/二期VM视觉学习/二期VM视觉学习/机器视觉程序/标定相机找圆心和焊头修正相机找圆心之算法软件/标定相机找圆心和焊头修正相机找圆心之算法软件/03 标定相机找圆心/S2/1号机/1.bmp) get_image_size …

【技术选型】MySQL、Oracle、Postgresql如何选择

【技术选型】MySQL、Oracle、Postgresql如何选择 开篇词&#xff1a;干货篇&#xff1a;MySQL&#xff1a;Oracle&#xff1a;PostgreSQL&#xff1a; 总结篇&#xff1a;我是杰叔叔&#xff0c;一名沪漂的码农&#xff0c;下期再会&#xff01; 开篇词&#xff1a; 常见几种关…

uniapp+vue3嵌入Markdown格式

使用的库是towxml 第一步&#xff1a;下载源文件&#xff0c;那么可以git clone&#xff0c;也可以直接下载压缩包 git clone https://github.com/sbfkcel/towxml.git 第二步&#xff1a;设置文件夹内的config.js&#xff0c;可以选择自己需要的格式 第三步&#xff1a;安装…

每日Attention学习9——Efficient Channel Attention

模块出处 [CVPR 20] [link] [code] ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks 模块名称 Efficient Channel Attention (ECA) 模块作用 通道注意力 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional …

CSS【详解】层叠 z-index (含 z-index 的层叠规则,不同样式的层叠效果)

仅对已定位的元素&#xff08; position:relative&#xff0c;position:absolute&#xff0c;position:fixed &#xff09;有效&#xff0c;默认值为0&#xff0c;可以为负值。 z-index 的层叠规则 z-index 值从小到大层叠 兄弟元素 z-index 值相同时&#xff0c;后面的元素在…

【Unity2D 2022:Audio】添加游戏音乐和音效

一、添加背景音乐 1. 创建空的游戏物体&#xff0c;名为BackgroundMusic 2. 为音频播放器添加音频源&#xff08;Audio Source&#xff09;组件 3. 将背景音乐音频赋值到AudioClip&#xff08;红色&#xff09; 4. 设置循环播放&#xff08;蓝色&#xff09; 二、添加草莓拾取…

Android Constant expression required (case R.id.xxx)

gradle更新到8.0后&#xff0c;遇到了这个报错 有两种解决方式&#xff1a; 1、在gradle.properties中添加下面代码 android.nonFinalResIdsfalse 2、使用if-else来判断 int id view.getId(); if (id R.id.setting_iv_back) {} else if (id R.id.setting_tv_clear) {}

【组件库】element-plus组件库

文章目录 0. 启动项目1. gc.sh 新增组件2. 本地验证(组件注册的方式)3. 官方文档修改3-1. 左侧菜单3-2 . 配置md文档3-3. 代码问题:文档修改----------------------------------------------4. 将naiveui的split 分割组件【 复制、迁移】到 element-ui-plus组件库4.1 naiveu…