leetcode 热题100
leetcode 热题100
大树~~
哦
展开
-
100、技巧-寻找重复的数
一个非常有效的解法是使用法,这个方法灵感来自于寻找链表环的起点的算法。我们可以把数组中的元素看作是链表的指针,例如nums[0]指向。根据题目条件,数组中至少有一个数字重复,这会导致链表出现环。原创 2024-05-10 23:54:03 · 289 阅读 · 0 评论 -
99、技巧-下一个排列
这个问题要求生成一个数组的下一个排列。所谓“下一个排列”指的是,在所有数字相同但顺序不同的排列中,找出数字序列中刚好比当前序列大的下一个序列。如果当前序列已经是这些排列中的最大值,则下一个排列应该是最小的排列。原创 2024-05-10 23:46:50 · 305 阅读 · 0 评论 -
98、技巧-颜色分类
该问题的关键在于我们要将所有的0放到数组的前部,所有的1放在中间,所有的2放在后部。这可以通过使用两个指针,一个指向数组开头的“0”的最后一个位置,另一个指向数组结尾的“2”的第一个位置,以及一个用来遍历数组的当前指针来实现。由于我们始终将2换到数组的尾部,这意味着交换到前面的元素(未经current检查的元素)需要再次检查,因此当current原创 2024-05-10 22:57:19 · 193 阅读 · 0 评论 -
97、技巧-多数元素
首先如果大于n/2的元素会有几个?假设有两个,那么元素个数就大于n,肯定不对的。所以最多会存在一个元素。又根据题意知道肯定是存在多数元素的,那么只要求出出现次数最多的元素就是多数元素。原创 2024-05-09 23:21:35 · 348 阅读 · 0 评论 -
96、技巧-只出现一次的数字
首先不考虑额外空间的话使用一个set去重即可。第二种就是异或运算。原创 2024-05-09 23:13:57 · 305 阅读 · 0 评论 -
95、动态规划-编辑距离
动态规划方法的核心思想是使用一个二维数组 dp 来存储中间结果,其中 dp[i][j] 表示将 word1 的前 i 个字符转换成 word2 的前 j 个字符所需的最小操作数。通过填充这个数组,我们可以逐步构建出从一个空字符串到完整 word2,再从完整 word1 到 word2 的转换路径。原创 2024-05-09 23:04:41 · 518 阅读 · 0 评论 -
94、动态规划-最长公共子序列
动态规划是优化递归的方法,使用表格来存储中间结果,避免重复计算。原创 2024-05-08 23:29:27 · 404 阅读 · 0 评论 -
93、动态规划-最长回文子串
首先从暴力递归开始,回文首尾指针相向运动肯定想等。就是回文,代码如下:递归面临很多重复计算,这个时候可以使用动态规划要找到一个字符串中的最长回文子串,我们可以利用动态规划来解决这个问题。动态规划的核心思想是将复杂的问题分解为更小的子问题,然后逐步解决这些子问题,从而得到整个问题的解。具体来说,我们可以通过以下步骤来解决这个问题:定义状态:初始条件:状态转移方程:遍历所有可能的子串长度和起始位置:找到最长的回文子串:原创 2024-05-08 23:20:25 · 428 阅读 · 0 评论 -
92、动态规划-最小路径和
然后依据此来改动态规划:使用动态规划(DP)解决问题是处理此类网格路径问题的更有效方法。在这种情况下,我们会创建一个与原网格同样大小的dp数组,其中dp[i][j]表示从左上角到位置(i, j)的最小路径和。原创 2024-05-08 23:02:17 · 265 阅读 · 0 评论 -
91、动态规划-不同的路径
然后根据这个递归来解动态规划。原创 2024-05-07 23:54:33 · 166 阅读 · 0 评论 -
90、动态规划-最长的有效括号
当i=1时候,判断括号是否是)如果不是那么无法结尾,跳过。先找出上一个有效的。然后从1开始 因为从0位置不管是左括号还是右括号都是无法形成一个完成的括号。所以dp[0]=0;dp[i]表示以i结尾的括号最长是多少。找出有效括号并且是最长的有效括号。原创 2024-05-06 23:25:13 · 258 阅读 · 0 评论 -
89、动态规划-分割等和子集
首先 数组和为奇数 肯定不行。然后穷举从0开始到N中要和不要组成数组,如果组成数组等于整体数组和的一半,那么就可以,返回true。原创 2024-05-05 18:19:04 · 213 阅读 · 0 评论 -
88、动态规划-乘积最大子数组
首先使用递归来解,从0开始到N,每次都从index开始到N的求出最大值。然后再次递归index+1到N的最大值,再求max。原创 2024-05-05 18:13:17 · 386 阅读 · 0 评论 -
87、动态规划-最长递增子序列
使用递归来理解题目,然后在看如何优化,假设我当前使用元素那么最长是多少,如果不使用当前元素最长是多少,然后取最大值。改成动态规划:其中dp[i]表示以nums[i]结尾的最长子序列是多少。原创 2024-05-04 20:22:31 · 216 阅读 · 0 评论 -
86、动态规划-单词拆分
使用递归当前元素从index开始到end是否可以组成一个目标字符串数组的的一个元素。如果可以继续,不可以跳过。最终返回方式种数,如果大于0为true,反之false。process方法从0开始。end从index开始递增如果index到end组成一种元素,继续递归剩下的元素。直到index=length表示已经递归完成得到一种方式。初始化dp[N]为1 表示一个空字符串总是可以被表示(基本情况)。个字符到字符串末尾的子字符串是否可以完全由。设置dp[i]表示:字符串。原创 2024-05-04 20:02:47 · 406 阅读 · 0 评论 -
85、动态规划-零钱兑换
还是老样子,还是先使用递归方式来解,然后通过递归推动态规划。那递归如何设计?定义一个递归方法:表示从index开始到N达到剩下的值(目标值减去上一步的值)做少可以得到数量是多少。首先获取index下对应的值:coin=coins[index] 然后确定当前值最优可以用几张:zhang=rest/coin然后设置一个最小值min;开始循环,如果使用当前值i张,那么一共需要多少张零钱。然后求一个最小值。最后返回min;原创 2024-05-04 19:33:29 · 406 阅读 · 0 评论 -
84、动态规划-完全平方数
第二种动态规划:依照递归方式我们可以知道状态转移方程。原创 2024-05-03 20:43:33 · 323 阅读 · 0 评论 -
83、动态规划-打家劫舍
但是递归方式会有重复计算,知道了思路来改成动态规划就很容易。dp[N]=0,超出长度,dp[n-1]=nums[n-1]表示从n-1开始最优抢多少金额,那只能抢一家。dp状态转移方程就是Math.max(nums[i] + dp[i + 2], dp[i + 1]);首先使用递归方式求出最优解。从每个房屋开始,分别考虑偷与不偷两种情况,然后递归地对后续的房屋做同样的决策。这种方法确保了可以找到在不触发警报的情况下可能的最高金额。原创 2024-05-03 20:16:48 · 285 阅读 · 0 评论 -
82、动态规划-杨辉三角
本题其实很容易看出来,首尾都是1,然后第2个元素就是上一行的第一个元素和第二个元素之和。可以得出结论:dp[i][j]=dp[i-1][j-1]+dp[i-1][j],当然要去掉首尾元素。原创 2024-05-03 19:47:50 · 158 阅读 · 0 评论 -
81、动态规划-爬楼梯
比如现在n阶楼梯,每次爬1阶或者2阶,一共有多少种方法。那么我就可以全排列,比如当前我可以走一阶算一下有多少种方法,然后我可以走两阶有多少种方法,然后想加就得到了最终方法数量。但是其中是有重复计算的,比如每次都是要重复计算从当前阶到最后一阶的种类数。如果将之前的记录下来,是不是就可以提高效率了,这个就是递归。这里计算时候就是在重复计算,这个就是我说的浪费。如果利用之前的计算不再进行重复计算那么就是动态规划。爬楼梯是一个特别经典的动态规划题,动态规划最好的办法就是从递归改到动态规划。原创 2024-05-02 15:32:21 · 357 阅读 · 0 评论 -
80、贪心-划分字母区间
首先理解题意,把一个字符串划分成经可能多的片段,但是要复合规则,其它片段不能包含当前片段的元素。假设abdcafgh,那么对于a来说,他的出现的最后一次是在在哪里呢?假设在i处,那么0-i能否成为一个片段呢?那就要看1-到i-1中元素在i只有是否也存在。首先要建立一个辅助数组far。他表示每一个元素出现的最后一次在哪个位置上。原创 2024-05-02 15:14:37 · 20 阅读 · 0 评论 -
79、贪心-跳跃游戏II
第三针:贪心,局部最优导致全局最优。也就是在0-i上最远可以跳多远j,那么在0-j上可达,在0-j上最远可以跳多远。以此类推,最终得出最少次数。每次都求的最少次数,导致全部加起来也是最少次数。第一种:使用递归,将所有跳转路径都获取到进行求出最小值。第二种:使用动态规划,下一次最优取决上一次的最优解。首先理解题意:从首位置跳最少多少次到达末尾。原创 2024-05-02 14:47:10 · 448 阅读 · 0 评论 -
78、贪心-跳跃游戏
跳跃游戏原创 2024-05-01 19:00:46 · 753 阅读 · 1 评论 -
77、贪心-买卖股票的最佳时机
遍历每一位元素找出当前元素最佳卖出是收益是多少。然后依次获取最大值,就是全局最大值。这里可以做一个辅助数组:右侧最大数组,求右侧最大数组就要从右往左求。比如[7,1,5,3,6,4],从4开始,没有右侧,取-1,到6,右侧最大是4,到3,右侧最大是6,依次类推。具体会导致全局最优,这里就可以使用贪心算法。原创 2024-05-01 18:38:53 · 232 阅读 · 0 评论 -
76、堆-数据流的中位数
最大堆和最小堆的堆顶元素可以视为中位数或中位数的候选值,因为这两个元素正好将整个数据集分为两个等长的部分,或者其中一个部分多一个元素(当数据总数是奇数时)。整体上,这个设计利用了最大堆和最小堆各自的性质,以及它们在维护中位数方面的互补性,从而提供了一个既高效又简洁的解决方案。当数据总数为奇数时,中位数是元素多的那个堆的堆顶元素。如果两个堆的大小不等,这意味着元素总数是奇数,我们返回元素较多的那个堆的堆顶元素作为中位数。如果两个堆的大小相等,这意味着元素总数是偶数,我们返回两个堆顶元素的平均值作为中位数。原创 2024-05-01 10:42:19 · 208 阅读 · 0 评论 -
75、堆-前K个高频元素
这道题还是使用优先队列,是要大根堆,然后创建一个类,成员变量值和次数。大根堆基于次数排序。前k个就拿出前k的类的值即可。原创 2024-04-30 22:49:04 · 68 阅读 · 0 评论 -
74、堆-数组中的第K个最大元素
直接排序是可以的,但是时间复杂度不符合。原创 2024-04-30 22:45:36 · 110 阅读 · 0 评论 -
73、栈-柱状图中最大的矩形
就是在宽度中最矮的元素。如何确定宽度,就是要确定左右边界。矩形面积:宽度*高度。原创 2024-04-30 22:36:49 · 349 阅读 · 0 评论 -
72、栈-每日温度
第一种方法,双循环,第一层循环拿出一个元素,第二层循环寻找最近比当前大的元素位置。第二种方法:使用栈来实现。原创 2024-04-29 23:21:41 · 150 阅读 · 0 评论 -
71、栈-字符串解码
由上面两个例子可以看出,当遇到[的时候可以先不结算,当遇到 ]的时候结算,结算左侧最近的右括号[。这个也是使用栈的思想。可以使用两个栈一个用于存储字符的栈 () 和一个用于存储重复次数的栈 (原创 2024-04-29 23:07:37 · 93 阅读 · 0 评论 -
70、栈-最小栈
除了最后一个获取最小值以外,其他都可以使用一个栈来实现,但是如果当前一个最小值被移除了,如果获取第二小的值,这个是需要记录的。所以最好的办法是两个栈。一个作为主栈存放数据,一个作为辅栈,存放最小值。原创 2024-04-29 22:40:31 · 310 阅读 · 0 评论 -
69、栈-有效的括号
比如:({)} 这个就是错误的,({}) 这个就是正确的。所以每一个做括号,必有一个对应的右括号,并且需要顺序正确。这里有({ 时候如果第三个是右括号,必须是} 不然就是错误的。找出规则就是先进后出。有效的括号序列是指每个开括号都有一个对应的闭括号,并且括号的配对顺序正确。原创 2024-04-28 23:52:23 · 196 阅读 · 0 评论 -
67、二分-寻找两个正序数组的中位数
第二种方式:改成求第k小的数。那么中位数就是第mid小的数。这个求第K小的数据就可以使用二分的方式。2、只要排序到新数组长度的一半就可以得到中位数。因为我们不需要有序的数组,所以新建一个数组来记录。第一种方式双指针,只要排序一半数组的就行,那么就找到中位数。两个指针谁小移动谁。1、两个都是有序数组,那么中位数就是合并成一个新的有序数组的中位数。原创 2024-04-28 23:41:23 · 189 阅读 · 0 评论 -
67、二分-寻找旋转排序数组中的最小值
不管旋转多少次,在旋转点两侧都是有序的,其中旋转点就是最小值。所以只要找到旋转值就是目标值。可以通过二分方式寻找。从0-N-1上寻找。如果L的值小于R的值说从L到R上递增,那么L就是旋转点。反之就求出mid=L+(R-L)/2 目的防止整数溢出。如果L到mid是递减的,那么旋转点就是在右侧,继续递归寻找。原创 2024-04-28 23:18:53 · 156 阅读 · 0 评论 -
66、二分-搜索旋转排序数组
不断二分,首先判断左侧有序还是右侧有序,如果左侧有序那么就在左侧寻找,如果右侧有序那就在右侧寻找。假设左侧有序,那就判断目标值在不在左侧,如果在左侧继续左侧二分。如果不在左侧,那么在右侧继续二分再去寻找。突出点不断二分,然后在有序部分寻找。有序部分没找到,那就在二分再在有序部分寻找。原创 2024-04-27 22:05:59 · 322 阅读 · 0 评论 -
65、二分-在排序数组中查找元素的第一个和最后一个位置
第一种方式直接线性遍历,找到目标值记录当前下标。继续寻找下一个不等于目标值,说明下一个目标值的下标就是结尾。第二种方式通过使用二分法寻找,先二分寻找寻找第一个目标值,如果存在再继续寻找最后一个目标值。寻找数组中的目标值第一个和最后一个,如果不存在哪儿就是返回-1。原创 2024-04-27 21:22:06 · 154 阅读 · 0 评论 -
64、二分-搜索二维矩阵
通过使用二分方式,对于每行进行二分,因为每行的最后一个数小于下一行的第一个数,我们就可以依次二分。首先取出行数N,然后从0-N进行二分,如果mid最后一个数小于目标值说明0-mid中没有,舍弃,从mid+1到N-1行进行寻找。然后在进行二分直到找到或者便利完为止。原创 2024-04-27 20:21:38 · 354 阅读 · 0 评论 -
63、二分-搜索插入的位置
去中位数,不断二分。如果目标值小于等于L1说在左边直接返回 ,如果等于r1直接返回r1。如果目标值小于等于L2但是大于R1,直接返回L2。如果等于大于等于R2直接返回R2。剩下的部分看落在哪个区间,继续递归。原创 2024-04-26 23:47:00 · 147 阅读 · 0 评论 -
62、回溯-N皇后
N皇后问题要求在一个n×n的棋盘上放置n个皇后,使得它们不能相互攻击。皇后可以攻击同一行、同一列,以及两个对角线方向上的其他皇后。解决这个问题意味着找到所有可能的棋盘配置,每个配置都符合上述条件。原创 2024-04-26 23:30:03 · 883 阅读 · 0 评论 -
61、回溯-分割回文串
还是全排列的思路,列出每一种组合,然后验证是否是回文,如果是子串放入path中,在验证其他元素是否也是回文。原创 2024-04-26 23:13:10 · 342 阅读 · 0 评论