算法学习
嘿,请叫我小哥
变秃,变强
展开
-
回顾前面刷过的算法(8)
最近几天回顾了一下一下几道算法题目。原创 2024-08-23 17:57:35 · 250 阅读 · 1 评论 -
回顾前面刷过的算法(7)
今天回顾了下一下几道算法题目。原创 2024-08-20 17:22:53 · 184 阅读 · 0 评论 -
回顾前面刷过的算法(6)
今天回顾一下这几道算法。原创 2024-08-19 17:55:56 · 242 阅读 · 0 评论 -
回顾前面刷过的算法(5)
今天看一下这几道题目。原创 2024-08-12 18:13:49 · 112 阅读 · 0 评论 -
回顾前面刷过的算法(4)
今天回顾一下下面三个算法,涉及到了动态规划、合并链表、位运算,好吧,让我们再次手敲一遍。原创 2024-08-05 17:36:03 · 188 阅读 · 0 评论 -
回顾前面刷过的算法(3)
今天简单描述了一下算法思路并手敲了一下下面三个算法,算法题目是刷不完的,但是解题思想是有限的,我们需要学习的就是解题思想,代码展示如下。原创 2024-08-02 16:43:54 · 198 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(24)
主要利用在本题中会有这么一条规律,就是假设那个重复的数字是x,那么在[1,x - 1]里任意一个数y,满足小于等于y(包括本身)的元素个数count一定满足 count <= y,在[x, n - 1]里任意一个数y,满足小于等于y(包括本身)的元素个数count一定满足 count > y,这是因为在[x, n - 1]里多了个重复元素,我们可以使用二分法寻找那个x,代码如下。,把数组元素值当作索引,我们会发现如果有重复元素,那么会形成有环的链表, 如草图。原创 2024-06-19 09:30:00 · 225 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(13)
这种方法是评论里的大佬想出来的,可以学习一下,只要思想就是分别维护三个变量,前缀和、最小前缀和、前缀和 - 最小前缀和,其中答案就是前缀和 - 最小前缀和里最大的那个数,看代码和动态规划的思想有点类似,代码如下。今天来看看这道题,介绍两种解法。原创 2024-06-08 23:57:17 · 316 阅读 · 1 评论 -
定个小目标之刷LeetCode热题(15)
这道题直接就采用两数相加的规则,维护一个进阶值(n)即可,代码如下。原创 2024-06-10 22:49:57 · 304 阅读 · 1 评论 -
定个小目标之刷LeetCode热题(11)
是最优解,看了官方对这个算法的解释,我是这样理解的,就是在一个数组中有一个众数的数量大于所有元素数量的一半,那么我们可以这样想,每次删除数组里的任意两个不同的数字,会发现到最后只剩下众数了,主要还是众数数量多,所以理解了就可以很容易写出下面的代码了,画了个草图如下。这是道简单题,只想到了暴力解法,就是用集合存储起来,然后找出其中的众数,看了一下题解,发现有多种解法,我觉得。原创 2024-06-06 15:56:54 · 247 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(20)
这题与上一题有一点不同,上一题是判断链表是否存在环,这题是寻找入环的第一个节点,有一个规则是这样的,原创 2024-06-15 11:00:00 · 505 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(27)
imax = MAX(imax * nums[i], nums[i]),由于本题数组元素范围是整数,即存在负数,最大可能变最小,最小可能变最大,所以除了维护一个max,还需要维护一个imin,imin = MIN(imin * nums[i], nums[i]),在遇到负数时,需要将imax和imin进行交换,画草图如下。这道题,我们可以使用动态规划,假设数组元素范围是>=0,那么递推关系式表示为。知道了思路,代码很容易就能敲出来,代码如下所示。原创 2024-06-22 15:59:12 · 370 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(25)
【代码】定个小目标之刷LeetCode热题(25)原创 2024-06-20 19:33:07 · 315 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(10)
思路和动态规划类似,比如对一个字符串 ababa,以最中间的 a 作为中心点,往两边扩散,第一次扩散发现 left 指向的是 b,right 指向的也是 b,所以是回文串,继续扩散,同理 ababa 也是回文串。状态转移方程:当s[i] == s[j] && (j - i < 2 || dp[i + 1][j - 1])时,dp[i][j] = true,否则为false。2.当有两个相同的字符时,也是一个回文串,即s[i] == s[j] && j - i == 1。原创 2024-06-05 17:28:00 · 450 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(22)
这道题最容易想的就是排序后再遍历,但是时间复杂度就不是O(n)了,所以还是得用更优的解法,直接看题解,,文字描述了一遍,试着以这种思路编码,代码如下。原创 2024-06-17 10:47:17 · 320 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(14)
了解股票的都知道,只需要选择股票最低价格那天购入,在股票价格与最低价差值最大时卖出即可获取最大收益,总之本题只需要维护两个变量即可,minPrice和maxProfit,,直接用代码描述如下。原创 2024-06-09 22:29:38 · 552 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(26)
这道题属于一道简单题,可以使用。原创 2024-06-21 21:02:14 · 237 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(17)
这是道经典的动态规划问题,然而我还是无从下手,当看了题解之后才发现自己好像又懂了,哈哈,这应该就是菜鸟心理吧,递推关系式的推导过程可以去LeetCode看一下,这里我就不描述了。其中nums[k - 1]是输入的数组,f(k)表示偷前k - 1个房屋能偷得的最大金额,那么用代码描述一下。我们都知道大部分动态规划在空间上都是可以优化的,比如本题,我们只想得到dp[len]的值,在递推结束后。,直接看代码,注释有写优化过程。原创 2024-06-12 10:57:08 · 188 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(18)
在之前有写过类似的一道题,见。原创 2024-06-13 09:30:00 · 188 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(9)
有人会想那么这个前缀树是如何存储结点值的呢,这就要搞清楚字母映射表next 的作用,TrieNode* next[26]中保存了对当前结点下一个可能出现的所有字符的指针,因此我们可以通过一个父结点来预知它所有子结点的值,一个长度为n的单词,26个字母随机组合共有26的n次方种组合,这个长度为n的单词必存在其中,画个草图理解一下,如下所示。今天来看看这道题,去了解了一下前缀树的定义,它与普通的多叉树不一样,多叉树结构是(这里我就用C++语言表示)好了,大概了解了前缀树的概念,此题的代码如下,每一行都有解释。原创 2024-06-04 14:43:26 · 280 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(16)
重复上述步骤直到把链表都拆分完,这样这条链表每段长度为2的子链表都是有序的,那么要整条链表有序,我们只需要把subLength扩大并重复上述排序步骤即可,也就是每次拆分排序完。后再次进行拆分排序,直到subLength大于或者等于整条链表的长度,画草图如下所示。代码如下,每行都有解释。原创 2024-06-11 10:56:49 · 420 阅读 · 1 评论 -
定个小目标之刷LeetCode热题(28)
是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。最长递增子序列是 [2,3,7,101],因此长度为 4。,找到其中最长严格递增子序列的长度。,并记录其索引pos,然后。直接上代码如下,代码是使用。原创 2024-06-24 11:00:04 · 367 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(23)
通过cache.get(key)获取,如果存在则直接替换该结点的value并把该结点移动到链表头部,否则创建新的结点,把它put到chache中,然后添加到链表头部并且size++,最后判断size是否大于capacity,如果大于则需要移除链表尾部结点,并且需要移除cache中对应的结点,最后size--通过cache.get(key)获取,如果不存在则直接返回-1,否则返回对于key的value并把该结点移动到链表头部。今天写这道题,背过八股文的都应该知道。本题我们采用自己创建。原创 2024-06-18 10:39:06 · 431 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(21)
计算下标的形式来将数组元素与数组索引产生映射关系,代码如下,可以看下注释。这是道技巧题,利用了。原创 2024-06-16 23:00:36 · 335 阅读 · 1 评论 -
定个小目标之刷LeetCode热题(12)
所以我们只需要让数组里的所有元素进行异或运算得到的结果就是那个只出现一次的数字,代码如下所示。1、任何数异或 0 结果仍然是原来的数,即 a⊕0=a。2、任何数和其自身做异或运算,结果是 0。原创 2024-06-07 18:17:53 · 273 阅读 · 1 评论 -
定个小目标之刷LeetCode热题(19)
这是道简单题,直接用快慢指针,代码如下。原创 2024-06-14 16:23:41 · 182 阅读 · 1 评论 -
定个小目标之刷LeetCode热题(39)
请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。每次只能向下或者向右移动一步。类型,定义一个二维数组 dp,给定一个包含非负整数的。今天看这道题目,属于。原创 2024-07-04 14:11:28 · 250 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(30)
优化进行求解,简单说一下大概思路,首先遍历数组维护一个pre变量,表示前缀和,然后每次更新前缀和后把其作为key放到map中,value表示其出现的次数,要求某一段子数组的和该如何求解呢?假设pre8表示nums[0]~nums[8]的和,pre5表示nums[0]~nums[5]的和,那么pre8 - pre5表示的含义就是nums[6]~nums[8]的和,所以。,假设currentPre表示当前的前缀和,beforePre表示前面的前缀和,那么。子数组是数组中元素的连续非空序列。原创 2024-06-25 09:30:00 · 429 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(32)
回溯对于本题来说就是每次操作完数组之后再将其复原。今天看这道题目,先说下思路,主要采用递归。给定一个不含重复数字的数组。原创 2024-06-27 14:17:52 · 218 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(35)
今天看这道题目,如果用现有的栈实现,那么基本可以满足题目要求,但是getMin()函数需要另外实现,可以使用一个辅助栈来实现,就是辅助栈用来记录每个入栈元素对应的最小值,在入栈或者出栈时同步更新辅助栈,代码如下。也可以不使用现有栈,使用链表也能大概实现基本功能,代码如下。操作,并能在常数时间内检索到最小元素的栈。原创 2024-07-01 15:02:14 · 376 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(45)
遍历结束后不一定能得到最长有效括号的长度,因为如果输入的是“((((((()”时,此时如果从左向右遍历maxLength依旧为0,,两次不同方向遍历结束后就可以得到maxLength了,时间复杂度为O(n),空间复杂度为O(1),代码如下。有事会暂停更新,总之慢慢积累,今天看一下这道题,有。,思路就是分别定义两个计数器left和rigth,的字符串,找出最长有效(格式正确且连续)括号。最长有效括号子串是 "()"原创 2024-07-19 15:59:10 · 324 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(37)
按照这个规则遍历二叉树,然后把其存储在数组中,现在是反过来,给出已知先序遍历和中序遍历的两个数组,我们需要把这个二叉树构造出来,具体解题思路看代码。今天看这道题目,首先要先搞懂先序遍历和中序遍历的概念,我记得口诀是。,请构造二叉树并返回其根节点。原创 2024-07-02 14:31:39 · 164 阅读 · 0 评论 -
回顾前面刷过的算法(1)
之前刷了几十道简单的算法题,现在进行回顾,主要是为了巩固对每一道算法的理解,每次回顾都可能有新的收获,我回顾的方式主要就是再次理解一遍算法,然后重新手敲一遍,手敲是必须的,光看不写是没用的,记录展示如下。原创 2024-07-31 17:37:59 · 146 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(38)
(即逐层地,从左到右访问所有节点)。是一样的思路,直接上代码如下。原创 2024-07-03 14:29:26 · 128 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(42)
之前有做过前缀和的题目,假设我们要在一数组中寻找连续子数组和为 targetSum 的序列,那么我们可以用 map 记录前缀和 curr 以及出现的次数num,当 map 中存在 curr - targetSum 时说明存在连续子数组和为 targetSum 的序列,代码如下。不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。,求该二叉树里节点值之和等于。今天看这道题目,主要思想是。给定一个二叉树的根节点。原创 2024-07-08 15:01:27 · 266 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(44)
今天看一下这道题目,需要使用动态规划,定义dp[i]数组,dp[i]表示凑成总金额数为 i 至少需要dp[i]个硬币,要求解dp[i],那么dp[0]~dp[i - 1]都是已经求解出来的,转移方程如下。如果没有任何一种硬币组合能组成总金额,返回。其中 coins[j] <= i 的,代码如下。,表示不同面额的硬币;你可以认为每种硬币的数量是无限的。计算并返回可以凑成总金额所需的。原创 2024-07-10 14:18:15 · 294 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(31)
之中任意元素的全部前缀元素和后缀的乘积都在。之外其余各元素的乘积。今天刷的是这道题,说下大概的思路,时间复杂度内完成此题。原创 2024-06-26 14:41:20 · 402 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(41)
今天看一下这道简单题,主要考查。,计算其二进制表示中 1。原创 2024-07-06 17:27:11 · 368 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(43)
今天看一下这道题目,之前的算法题目也需要不间断的复习,才能加深印象,本题使用动态规划思想,定义 f(o) 和 g(o),f(o) 表示选中当前节点时能盗取的最大金额,g(o) 表示不选中当前节点时能盗取的最大金额,则有以下递推关系式(l表示左子节点,r表示右子节点)之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为。,小偷能够盗取的最高金额。原创 2024-07-09 10:51:58 · 274 阅读 · 0 评论 -
定个小目标之刷LeetCode热题(34)
通过k固定一个元素,然后两个i,j索引分别从数组两端向中间遍历寻找nums[k] + nums[i] + nums[j] = 0的三元组。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。答案中不可以包含重复的三元组。,判断是否存在三元组。今天看这道题目,思路是。原创 2024-06-29 16:33:06 · 342 阅读 · 0 评论