算法学习笔记
个人读研期间算法学习和刷题随笔
C-V御用工程师
一个还在读研的计算机人
展开
-
力扣之最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。输入:s = “babad”输出:“bab”原创 2022-06-22 15:32:03 · 414 阅读 · 0 评论 -
力扣算法题之合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。原创 2022-06-21 15:46:48 · 394 阅读 · 0 评论 -
力扣之二叉树层次遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。原创 2022-06-20 16:23:21 · 1253 阅读 · 0 评论 -
力扣之合并有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。原创 2022-06-19 20:34:41 · 284 阅读 · 0 评论 -
力扣之动态规划找最长子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。原创 2022-06-16 15:08:44 · 402 阅读 · 1 评论 -
力扣之螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。原创 2022-06-15 15:23:49 · 278 阅读 · 0 评论 -
力扣之字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。原创 2022-06-14 14:40:06 · 919 阅读 · 0 评论 -
力扣之接雨水问题
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子原创 2022-06-11 16:10:57 · 144 阅读 · 0 评论 -
力扣算法之八大排序算法总结
给你一个整数数组 nums,请你将该数组升序排列。示例 1:输入:nums = [5,2,3,1]输出:[1,2,3,5]示例 2:输入:nums = [5,1,1,2,0,0]输出:[0,0,1,1,2,5]原创 2022-06-08 14:40:24 · 1368 阅读 · 1 评论 -
力扣算法题之k个一组翻转链表
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。...原创 2022-06-06 16:08:06 · 369 阅读 · 0 评论 -
力扣之换零钱
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。原创 2022-06-04 15:20:36 · 126 阅读 · 0 评论 -
力扣之无重复最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度原创 2022-06-03 15:36:19 · 213 阅读 · 0 评论 -
剑指offer之二进制加法
给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。输入为 非空 字符串且只包含数字 1 和 0。示例 1:输入: a = “11”, b = “10”原创 2022-06-02 14:39:57 · 181 阅读 · 0 评论 -
力扣剑指offer之求前n项和
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。原创 2022-06-01 15:03:26 · 135 阅读 · 0 评论 -
剑指offer之合并两个链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4本题在力扣上给定的标签是简单题,这是因为合并的是两个有序链表,既然有序,那我们只需要将两个链表开始遍历,将小的一方放入新链表,指针后移即可。当有一个链表为空时,就将不为空的链表依次遍历到新链表上,便完成了本题。跟着这个思路,我们可以很容易的写出本题代码如下:/** * Definitio原创 2022-05-31 14:42:11 · 154 阅读 · 1 评论 -
字典序输出不重复的全排列
今天下午参加某公司笔试时遇到的一道题,分享给大家:题意如下:现在给你一个字符数组,以及一个字符串长度限制(char[] arr, 2)。已知这个字符数组内的字符就是密码,现在让你输出所有的密码,密码不可重复,也不会出现重复字符,为了便于知道输出密码的正确性,我们会对程序输出结果进行一一比较,为了比较简单,请按照字典序输出。题目的核心意思就是这,只不过它给的题读起来要比这感觉绕一点,第一次读可能会让你感觉不知道如何下手。所以大家遇到题目比较长的情况,就静下心来,对照题目看给出的例子,试着用自己的文字或原创 2022-05-28 17:41:46 · 562 阅读 · 1 评论 -
力扣之吃葡萄问题
题目大意如下:现在有三堆葡萄a,b,c。现在规定三个人来吃这些葡萄,第一个人只能吃a,b两堆,第二个人只能吃b,c两堆,第三个人只能吃c,a两堆。问你三人中吃得最多的人它最少吃多少个葡萄?分析:三个人,三堆葡萄,如果没有任何限制,那指定是三人均分,此时吃得最多的人它吃到的葡萄肯定是最少的。这种情况应该好理解,因为你想让吃最多葡萄的人吃的数量最小,那你进行平均分配后,吃最多的人也就是比其它人多吃1个,这种情况下,它吃的葡萄会比其它情况下的都少。但是现在又加了一个限制条件,每个人只能吃设定的两堆,那么此时原创 2022-05-27 14:30:31 · 301 阅读 · 0 评论 -
力扣剑指offer之扑克牌中的顺子
原创 2022-05-26 17:45:27 · 298 阅读 · 1 评论 -
力扣剑指pffer之寻找丑数
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。分析:丑数必定是在之前丑数基础上乘以2,或3,或5得到的。如 1是丑数,则2,3,5也是丑数,2是丑数,则4,6,10也是丑数。我们使用优先级队列,将每个丑数都放进去,然后寻找前n个即可得到第n个丑数。需要注意的点:1、要避免25和52都是10这种重复情况,原创 2022-05-25 15:39:35 · 182 阅读 · 0 评论 -
力扣剑指offer之剪绳子问题
*给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1解析:本题力扣给的标签是中等题,但其实本题思路并不好想到,你可以第一眼看过去就想用递归加回溯来做,甚至是加原创 2022-05-24 17:53:51 · 317 阅读 · 1 评论 -
剑指offer之重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]Output: [3,9,20,null,null,15,7]题目如上所示分析:本题力扣给的标签是中等题,但是如果你理解了几个关键点,本题说是简单题也不为过。1、什么是前序和中序遍历,也就是说给你一颗二叉树,你能写出来中序和前序遍历吗?中序遍历就是左中右的顺序,原创 2022-05-23 17:05:02 · 123 阅读 · 1 评论 -
力扣剑指offer之数组组成最小数
题目:给定一个整数型数组,数组内所有数字都是非负的,让你求出由这个数组内所有数字组成的最小数。例子:【10,2】 输出:102.解释:最小数肯定不能是210,所以应该是102.解析:这个题目在力扣上给定的标签是中等题,但是如果你发现不了问题的本质,该题并不好写出正确答案。需要考虑的点有:1)最小数,那也就是说我们应该选择第一个字符是最小字符的数作为结果的第一个组成部分。比如说【10,2】,第一个数它的第一个字符为1,第二个数,第一个字符为2,所以我们选择第一个数作为结果的第一个组成部分。2)然原创 2022-05-22 14:42:48 · 259 阅读 · 1 评论 -
力扣剑指offer之二叉树中寻找定长路径
对于二叉树中寻找定长路径类的题目,一般情况下都会分为两类。1、在一颗二叉树中,从根节点出发,寻找到叶子节点的路径,该路径长度为target。2、寻找二叉树中路径长度为target的路径集合。可以看到,这两者的区别就在于前者定义了只能从根到叶子,后者定义可以从任意节点到任意节点。我们先来看第一种情况的题目:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。根据题意,我们应该能想到深度优原创 2022-05-21 14:38:01 · 143 阅读 · 1 评论 -
力扣剑指offer之字符串的翻转
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。解析:看见本题,我相信大家都不会陌生,并且或多或少都会想出来几种写法,但是当你实际坐下来,你会发现写比想难多了。在这里主要提供本人所实现的思路:我相信这种思路大家应该也听过:1、我们先将字符串前后的空格去除2、将字符串单词间多余的空格去除(记住是多余的空格,原单词间该有的空格可不能省去)3、然后将这个字原创 2022-05-20 17:50:30 · 170 阅读 · 1 评论 -
力扣剑指offer之数组中的孤单数II
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。示例 1:输入:nums = [3,4,3,3]输出:4示例 2:输入:nums = [9,1,7,9,7,9,7]输出:1解析:本题是上一篇文章题目的延申,在之前的文章中,我们聊到了在一个数组中有一个孤单数如果去找,在一个数组中有两个孤单数如何去找等题目。今天我们要聊的是在一个数组中,有一个孤单数,但是其它数不再是两两成对,而是三三成对了。让你找这个孤单数。很明显,直接异或的招数不好使了,那原创 2022-05-19 15:27:36 · 162 阅读 · 1 评论 -
力扣剑指offer之数组中孤独的数字
关于数组中孤独的数字,是指在一个数组内,大部分数字都是成对出现,只有一个或者两个是孤单的。现在让你去找到这孤单的一个或者两个数字。我们先解决简单的问题:假设一个数组内只出现一个孤单的数字,让你找出来?例如:【1,2,1,2,3】 让你找出这个3来。思路解析:两两成对出现,只有一个元素落单,那么我们很容易想到将数组排序,然后两两成对比较,如果这一对不相等,那么孤单的数字肯定出现在这一对中。我们可以找这一对前面的一个数字或者后面的一个数字与它俩分别看看能不能凑成一对,如果不能,则说明这个孤单的数字就是它原创 2022-05-18 17:54:54 · 790 阅读 · 1 评论 -
力扣剑指offer之位运算
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“”、“/” 四则运算符号。示例:输入: a = 1, b = 1输出: 2解析:本题力扣所给的标签是简单题,但是很明显,本题并不是一个容易想到解法的题,属于难者不会,会者不难型的。本题让其一个两数之和,但是却不让使用加减乘除符号运算,那能用上的运算可以想到的就是异或,与,或,非等位运算了。那该怎么使用这些位运算呢?我们通过观察0,1之间的加法操作可以发现:1)执行加法后的非进位位等价于两者的异或操作结果。2)执行加法后的进位位原创 2022-05-17 14:06:43 · 886 阅读 · 5 评论 -
力扣剑指offer之最小的k个数
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 1:输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]示例 2:输入:arr = [0,1,2,1], k = 1输出:[0]解析:本题力扣标签是简单,猛的一看确实是简单题,这不就是一个排序加一个前k位吗??所以你可以直接写出下面代码:public int[] getLeastNumbers(int[] arr, int原创 2022-05-16 14:05:54 · 269 阅读 · 0 评论 -
力扣剑指offer之判断是否为平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。解析:本题在力扣上也是标注简单题,但是我认为在该题中还是有一些内容需要注意的。1、平衡二叉树,也就是说对于这颗树的每一个节点,其左孩子和右孩子的高度差都应该小于等于1才可。2、要注意一定是每一个节点都满足1中的高度差条件,切勿仅仅满足root这个节点,就着急返回,导致下面节点没有判断是否满足高度差条件。因此,我们写代码就要两部分组成,第一就是要对每一个节点判断高度差,所以需原创 2022-05-15 14:21:24 · 105 阅读 · 0 评论 -
力扣剑指offer之和为s的连续数组
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]解析:看到本题,我相信大部分人都能想到并实现普通的暴力解法:1)从1到target开始遍历每一个数,将每一个数都假设作为满足条件的连续整数序列的起始元素,来进行逐个验证是否满足假设。2)写函数来验证假设。在函数内部,就是从当前值出发,进行叠加,如果能有叠加值正好等于ta原创 2022-05-12 16:03:53 · 86 阅读 · 0 评论 -
力扣剑指offer之公共父节点类题
关于最近公共父节点问题,目前我遇到的有两类:1、一类是给你一颗普通二叉树,让你求,你只能按部就班的求。2、一类是给你一颗有一定条件约束的二叉树,让你求,这时候你就可以想办法利用这些设定约束条件。例题一:给你一颗二叉搜索树,让你求两个节点的最近公共父节点。分析:给定两个节点p,q。那么这两个节点相对于当前节点root来说,无外乎三种情况:1)在root的左子树上2)在root的右子树上3)一个在左子树一个在右子树。对于第三种情况,它的最近公共父节点就是root。对于前两种情况,那就递归继续往下原创 2022-05-11 14:26:11 · 503 阅读 · 1 评论 -
力扣剑指offer之和为s的两个数
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例 1:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]解析:本题又是一道简单题,你当然可以直接两层循环暴力搜索,只不过时间复杂度会很高,所以不采用这种方法。下面写两种最常见的思路:1、可以借助map数据结构,利用map数据结构中containsKey()这个api,你可以快速知道map中有没有你想要的内容,所以我们从第一原创 2022-05-10 14:56:17 · 132 阅读 · 1 评论 -
力扣剑指offer之打印倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.解析:本题根据力扣的标注,是简单题,但是你仔细研究发现,确实是简单题。。。可是就是这个简单题,我相信一遍就能通过所有样例的人不会太多吧。其原创 2022-05-09 16:42:13 · 61 阅读 · 1 评论 -
力扣剑指offer之打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]思路复现: 第一次看见本题,会感觉挺简单的,并且力扣给的标签也是简单,所以很容易直接下笔就写代码。这里只需要注意几个点:1、给定一个数值n,你怎么得到最后一个n位数是多少呢?我们可以这样思考:我们假定给的数值是2,那最后一个两位数就是99,它的下一位100不就是10的2次方吗??我们在尝试带入三,原创 2022-05-07 17:14:43 · 184 阅读 · 0 评论 -
力扣最热100题之搜索二维矩阵
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。解法分析:这道题直观上感觉就是一个二维数组遍历呗,直接写双循环就可以。**但是,**如果这道题面试考到,你肯定不好意思写双循环,并且面试官也肯定不是让你暴力写双循环解决。所以我们就需要想别的办法了。这道题有两个设置条件,左边一定小于右边,上面一定小于下面。也就是说,一行中最大在最右面,一列中最大在最下面。如果我们判断target大于某一原创 2022-04-27 21:47:37 · 326 阅读 · 1 评论 -
力扣最热100题之字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。解释:本题的难点和核心就在于它不仅可以中括号并排排放(2[as]3[er]),也可以中括号嵌套排放(3[原创 2022-04-26 17:31:24 · 410 阅读 · 1 评论 -
力扣最热100题之字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。示例 1:输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]示例 2:输入: strs = [“”]输出: [[“”]]思路:注意,看到这种分组类问题,一定要想到数据结构map原创 2022-04-25 17:41:31 · 852 阅读 · 1 评论 -
力扣最热100题之找异位词
题目:给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。分析:要解决该问题,首先应该明白,什么叫异位词?就是由相同的字母组成的不同顺序的两个字符串,就称为彼此的异位词(自己和自己也是互为异位词)。因此我们要找的就是在s中和p互为异位词的所有子串的首字母索引。首先,我们就可以想到暴力解法(该解法虽然容易想到,但是时间复杂度高):1、先利用数据结构(或map,或数组),来存储p中元素以及对应字母元素的个数。2、对于s字符串,从下标0开始原创 2022-04-24 18:09:22 · 919 阅读 · 1 评论 -
力扣最热100题之验证二叉搜索树
二叉搜索树原创 2022-04-18 16:52:58 · 336 阅读 · 1 评论 -
力扣最热100题之回溯算法全排列问题
回溯问题是我们面试中会经常遇到的问题,它和贪心问题以及动态规划问题可以说是面试三位常客,本篇文章就会从根本上讲清楚回溯问题中排列相关问题...原创 2022-04-15 09:49:40 · 188 阅读 · 1 评论