自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 算法通关村第十九关——最少硬币数

LeetCode322.给你一个整数数组 coins,表示不同面额的硬币,以及一个整数 amount,表示总金额。在这里的两层 for 循环中,要把1到 amount 的每一个数都遍历,在第二层循环中,遍历已知硬币,如果当前遍历的硬币小于等于 i 的话,就说明可以用这个硬币,那么就让当前的 dp 等于dp[i]和 dp[0] + 1中的一个。输入:coins=[1,2,5],amount = 11。输入:coins=[2,5,7],amount=27。解释:11 = 5 + 5 + 1。

2023-09-06 22:45:53 554

原创 算法通关村第十九关——最小路径和

LeetCode64. 给定一个包含非负整数的 m × n 网格 grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。对于每一块方块来说,只能从他的上边或者左边走过来,所以在for循环中的要取上边过来的和左边过来的最小的。并且在dp中的二维数组中每一个位置存放的都是到当前位置的最小路径和。输入:grid=[[1,3,1],[1,5,1],[4,2,1]]解释:因为路径1→3→1→1→1的总和最小。

2023-09-05 21:02:58 1226

原创 算法通关村第十八关——排列问题

在这里for循环中,used[i]的变化可以这样理解,现在这一层刚上来当前元素肯定是没有使用过的,在执行了将used数组当前元素变为已使用,将当前元素添加到path中后,就要进入他的下一层了,在他的下面几层当前元素都是使用过的。元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次,所以就不能使用startlndex了,为此可以使用一个used数组来标记已经选择的元素。输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]输入:[1,2,3]

2023-09-03 20:26:37 691

原创 算法通关村第十八关——回溯

回溯很大感觉就是多重递归,在递归的题目中,例如斐波那契数列,只需要考虑当前情况以及他的子情况。进入dfs,将当前节点添加到temp列表中,如果是叶子节点,那说明当前分支已经处理完了,像结果列表中添加拼接后的temp列表。如果不是叶子节点,那么就遍历左子树,右子树,按照前序的顺序来回溯,注意在当前分支结束后,要将最下面的那个节点去掉。LeetCode257:给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。输出:["1->2->5","1->3"]叶子节点是指没有子节点的节点。

2023-09-03 19:11:30 845

原创 算法通关村第十七关——跳跃游戏

数组中的每个元素代表你在该位置可以跳跃的最大长度,判断你是否能够到达最后一个位置。定义一个cover表示最远能够到达的方位,也就是i每次移动只能在其cover的范围内移动,如果cover大于等于了终点下标,直接return true。解释:无论怎样,你总会到达索引为3的位置。但该位置的最大跳跃长度是 0,所以你永远不可能到达最后一个位置。解释:从位置 0 到 1 跳 1 步,然后跳 3 步到达最后一个位置。输入:[2,3,1,1,4]输入:[3,2,1,0,4]

2023-09-02 20:54:06 531

原创 算法通关村第十七关——插入区间

知道满足条件时,在下一个循环处理,如果当前区间的左边≤新区间的右边的话,让新区间的左边等于两个区间的左边的最小值,让新区间的右边等于当前区间的新区间的右边的最大值。输入:interva1s=[[1,2],[3,5],[6,7],[8,10],[12,16]], newInterva1=[4,8]解释:新区间[4,8]与[3,5],[6,7],[8,10]重叠,因此合并成为[3,10]。输入:interva1s=[[1,3],[6,9]],newInterva1=[2,5]输出:[[1,5],[6,9]]

2023-09-02 20:36:03 238

原创 算法通关村第十七关——柠檬水找零

贪心算法解决0-1背包问题的基本思路是:按照物品的单位价值(即价值与重量的比值)从高到低进行排序,然后依次选择单位价值最高的物品放入背包,直到背包装满或者所有物品都已经被考虑过。如果当前物品的重量加上已经放入背包的物品的总重量不超过背包的容量,那么我们就将其放入背包。如果当前物品的重量加上已经放入背包的物品的总重量超过了背包的容量,那么我们就放弃放入这个物品。3.如果给的是20,那么优先消耗一个10元,再给一个5元。2.如果给的是10元,那么收下一个10,给出一个5,此时必须要有一个5才行。

2023-08-31 19:39:31 153

原创 算法通关村第十六关——滑动窗口与堆结合

LeetCode239给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。滑动窗口每次只向右移动一位,返回滑动窗口中的最大值。如果队首元素的索引值小于等于当前滑动窗口的起始索引,则说明该元素已经不在当前滑动窗口的范围内,需要将其从优先队列中移除。输入:nums=[1,3,-1,-3,5,3,6,7],k=3。优先队列中每个值存储的是一个包含元素值和对应索引的数组。表示队首元素的索引值是否小于等于当前滑动窗口的起始索引。输出:[3,3,5,5,6,7]存储的是这样的数组。

2023-08-28 20:38:35 436

原创 算法通关村第十六关——长度最小的子数组

sum变为10,sum大于target,min变为4,sum变为7,left变为2,sum等于target,min变为3,left变为3。sum变为10,sum大于target,min变为3,sum变为8,left变为4,sum大于target,min变为2,left变为4。sum变为8,sum大于target,min变为4,sum变为6,left变为1。输入:target=7,nums=[2,3,1,2,4,3]sum变为2,sum不大于等于target,输入nums=[2,3,1,2,4,3]

2023-08-27 19:57:40 160

原创 算法通关村第十六关——子数组最大平均数

在这里,很有一种在堆的学习那里的在数组中寻找第K大的元素,那时候的解决方法是先将前K个元素加入堆中,然后再从K开始依次遍历,这里也是一样的。LeetCode643给定n个整数,找出平均数最大且长度为k的连续子数组,并输出该最大平均数。这一步实现的就是向右移动一位,那么就需要加上右边的这位,减去最左边的那位。解释:最大平均数(12-5-6+56)/4 = 51/4 = 12.75。输入:[1,12,-5,-6,50,3],k = 4。其中1

2023-08-27 19:34:48 174

原创 算法通关村第十五关——从10亿数字中寻找最小的100万个数字

第二种方式是采用选择排序的方式,首先遍历10亿个数字找最小,然后再遍历一次找第二小,然后再一次找第三小,直到找到第100万个。堆占用的空间是100万*4,大约为4MB左右的空间就够了,因此也能接收。本题有三种常用的方法,一种是先排序所有元素,然后取出前100万个数,该方法的时间复杂度为O(nlogn)。第三种方式,采用大顶堆来解决,堆的原理在《查找》一章专门介绍过,方法思想是一致的,都是“查小用大堆,查大用小堆”。然后,遍历整个序列,只有比堆顶元素小的才允许插入堆中,并删除原堆的最大元素。

2023-08-26 19:45:14 609

原创 算法通关村第十五关——用2GB内存在20亿个整数中找到出现次数最多的数

解决办法是把包含20亿个数的大文件用哈希函数分成16个小文件,根据哈希函数的性质,同一种数不可能被散列到不同的小文件上,同时每个小文件中不同的数一定不会大于2亿种,假设哈希函数足够优秀。可能是在与面试官沟通的过程中由面试官指定,也可能是根据具体的限制来确定,比如本题确定分成16个文件,就是根据内存限制2GB的条件来确定的。如果20亿个数中不同的数超过2亿种,最极端的情况是20亿个数都不同,那么在哈希表中可能需要产生20亿条记录,这样内存会不够用,所以一次性用哈希表统计20亿个数的办法是有很大风险的。

2023-08-26 19:13:10 65

原创 算法通关村第十五关——用4KB内存寻找重复元素

题目要求:给定一个数组,包含从1到N的整数,N最大为32000,数组可能还有重复值,且N的取值不定,若只有4KB的内存可用,该如何打印数组中所有重复元素。,表示要设置的位的位置。首先,通过右移5位计算出该位置所在的字(word)的索引。,表示要获取的位的位置。进行位与运算(与0x1F相与),可以获取到该位置在该字中的位索引。进行位与运算(与0x1F相与),可以获取到该位置在该字中的位索引。进行位与运算,判断该位置上的位是否为1,如果是则返回。它也接受一个整数参数。进行位或运算,将该位置上的位设置为1。

2023-08-25 20:30:25 222

原创 算法通关村第十四关——在数组中寻找第K大的元素

LeetCode215给定整数数组nums和整数处,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。输入:[3,2,3,1,2,4,5,5,6]和 k = 4。输入:[3,2,1,5,6,4]和 k = 2。

2023-08-21 20:43:18 73

原创 算法通关村第十四关——堆

大顶堆:任意节点的值均大于等于它的左右孩子,并且最大的值位于堆顶,即根节点处。大和小的特征等都是类以的,只是比较的时候是按照大还是小来定,我们本章在原理方面的介绍就按照最大堆来进行,后面的题目再根据情况来定。d. 继续,23和其孩子比较,23和204交换,交换完之后,23的子树却不满足了,所以还需调整它的子树。使用数组构建堆时,就是先按照层次将所有元素依次填入二叉树中,使其成为二叉树,然后再不断调整,最终使其符合堆结构。小顶堆:任意节点的值均小于等于它的左右孩子,并且最小的值位于堆顶,即根节点处。

2023-08-21 20:34:29 42

原创 算法通关村第十三关——丑数

为判断 n 是否满足上述形式,可以对 n 反复除以 2,3,5,直到 n 不再包含质因数 2,3,5。若刺下的数等于1,则说明n不包含其他质因数,是丑数;否则,说明包含其他质因数,不是丑数。这个是剑指offer中的题目,我们把只包含质因子2、3和5的数称作丑数(Ugly Number),求按从小到大的顺序的第n个丑数。当n>0时,若n是丑数,则n可以写成 n = 2^a + 3^b + 5^c的形式,其中a,b,c都是非负整数。解释:1,2,3,4,5,6,8,9,10,12是前 10 个丑数。

2023-08-20 20:17:00 162

原创 算法通关村第十三关——数组实现整数加法

LeetCode66.具体要求是由整数组成的非空数组所表示的非负整数,在其基础上加一。这里从最右边开始处理,直接给当前元素加一,再让当前位置的元素对10求模,如果经过这样的处理后当前位置的元素不等于0,那就说明当前位置原来的元素加一小于10,那么直接返回数组,就结束了。如果能执行到循环下边的代码,就说明加一后的元素个数比原来的元素个数多一位,将数组大小+1,让最左边一位等于1,返回。如果经过这样的处理后当前位置的元素等于0,那就说明当前位置原来的元素加一大于等于10,那么继续进行循环就可以了。

2023-08-20 20:04:43 61

原创 算法通关村是十三关——回文数

当输入是奇数的时候,在最后一次循环,x除以10,revertedNumber×10再加上刚才x%10的余数,会比x多一位。进入循环的条件,如果x > revertedNumber,那么就可以继续循环,revertedNumber就是x的回文数。如果x和revertedNumber相等或者x等于revertedNumber / 10的话,就是回文数。LeetCode9 给你一个整数X,如果x是一个回文整数,返回true;不断地取余数,不断地除以10,处理完后。例如,121是回文,而123不是。

2023-08-19 21:04:08 42

原创 算法通关村第十二关——字符串压缩

输入:chars=["a","b","b","b","b","b","b","b","b","b","b","b","b"]输出:返回6,输入数组的前6个字符应该是:["a","2","b","2","c","3"]输出:返回4,输入数组的前4个字符应该是:["a","b","1","2"]。输入:chars=["a","a","b","b","c","c","c"]"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。输出:返回1,输入数组的前1个字符应该是:["a"]

2023-08-18 20:52:58 79

原创 算法通关村第十二关——反转字符串里的单词

然后,将每个单词翻转,在翻转单词的代码中,让end指向当前单词的末尾,然后再一次调用reverse方法,翻转单词,start等于下一个单词的开头,让end++,因为在没有++的时候end是指向单词之间的空格的。然后,比如字符串中单词之间有不止一个空格,那么将他们全部变为一个空格,方便后面反转单词。首先,先要去除字符串的前置空格和后置空格,就是字符串最前面的空格和最后面的空格。解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。输入:s="the sky is blue'"

2023-08-17 20:25:02 55

原创 算法通关村第十二关——字符串转换整数

我们要先考虑一些极端的情况,输入的字符串中有一堆没用的空格,需要跳过这些空格,如果输入的字符串中全是空格的话,就要加一个判断语句,如果当前索引等于字符串长度,返回。LeetCode8. 请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个32位有符号整数(类似C/C++中的atoi函数)。如果字符串中的数字是带符号的,也要先一步进行处理。在最后将每一位转换成数字的时候要带着sign乘。因此,在乘法操作中,需要将符号位。乘进去,以处理负数的情况。

2023-08-15 20:36:45 55

原创 算法通关村第十一关——比特位计数

利用位运算的技巧,可以提升计算速度。按位与运算(&)的一个性质是:对于任意整数x,令 x = x & (x - 1),该运算将 x 的二进制表示的最后一个 1 变成0。因此,对 x 重复该操作,直到 x 变成 0,则操作次数即为 x 的「一比特数」。在这里,countOnes方法就是在计算当前数的二进制中的1的个数。x &= (x - 1)做的是让x的二进制最右边的1去掉,计数加一。输出:[0,1,1]

2023-08-14 20:33:09 48

原创 算法通关村第十一关——位运算

首先,数字在计算机中的表示形式跟我们平常书面上的表示形式不同,就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值,比如如果是8位二进制:[+1]原=0000 0001[-1]原=1000 0001的表示方法是:正数的反码是其本身,而负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

2023-08-14 19:59:09 28

原创 算法通关村第十关——归并排序

归并排序(Merge Sort)是一种采用分治法(Divide and Conquer)策略的排序算法。它的基本思想是将一个大的数组分成若干个小的数组,分别对小数组进行排序,然后再将这些已经排序的小数组合并成一个大的有序数组。

2023-08-13 21:37:33 50

原创 算法通关村第十关——数组中第K大的数字

LeetCode215 数组中的第K个最大元素。给定整数数组 nums 和整数k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。这里的快速排序和之前的不同,这里是选定一个pivot,左边都是比它大的数,右边都是比他小的数。这样,要输出的就是[k - 1],数组中下标从0开始。输入:[3,2,3,1,2,4,5,5,6]和k=4。输入:[3,2,1,5,6,4]和k=2。

2023-08-12 21:13:47 47

原创 算法通关村第十关——快速排序

快速排序是将分治法运用到排序问题的典型例子,基本思想是:通过一个标记 pivot 元素将 n 个元素的序列划分为左右两个子序列 left 和 right,其中 left 中的元素都比 pivot 小,right 的都比 pivot 的大,然后再次对 Ieft 和 right 各自再执行快速排序,在将左右子序列排好序之后,整个序列就有序了。这里排序进行左右划分的时候是一直划分到子序列只包含一个元素的情况,然后再递归返回。这里例子为 [6, 3, 2, 1, 4, 5, 8, 7]

2023-08-11 20:50:00 57

原创 算法通关村第九关——有序数组转为二叉搜索树

LeetCode108给你一个整数数组nums,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过1」的二叉树。输入:nums=[-16,-3,0,5,9]输出:[6,-3,9,-16,nu11,5]总是选择中间位置左边的数字作为根节点。将一个有序数组转化为二叉搜索树。

2023-08-11 19:50:53 101

原创 算法通关村第九关——旋转数字的最小数字

high=pivot 是为了防止遗漏元素,例如[3,1,2],执行的时候nums[pivot]=1,小于nums[high]=2,此时如果high=pivot-1,则直接变成了0。注意,数组[a[0],a[1],a[2], ..., a[n-1]] 旋转一次的结果为数组 [a[n-1],a[0],a[1],a[2], ..., a[n-2]]。若旋转4次,则可以得到[4,5,6,7,0,1,2]若旋转7次,则可以得到[0,1,2,4,5,6,7]拿这个数组举例,low = 0,high = 6。

2023-08-09 20:08:36 93

原创 算法通关村第九关——二分查找

凡是涉及到在排好序的地方查找的都就可以考虑用二分来优化查找效率。不一定全局都排好才行,只要某个部分是排好的,就可以针对该部分进行二分查找,这是很多题目优化查找的重要途径。二分查找就是将中间结果与目标进行比较,一次去掉一半,,直到找到要的那个值,效率很高。这是经典的二分查找代码,一次比较就可以在当前范围内去掉一半的元素,效率很高。二分查找在很多领域都有涉及。

2023-08-07 21:55:03 45

原创 算法通关村第八关——寻找祖先

输入:root=[3,5,1,6,2,0,8,nu11,nu11,7,4],p = 6, q = 7。对于当前节点5来看,left为6,right为7,直接返回当前节点5。这时,对于当前节点2来看,left为7,right为空,直接返回7。当前节点为4,左右都为null,返回null。当前节点为6,满足第一行if,返回6。当前节点为7,满足第一行if,返回7。进入程序,第一行if不满足;当前节点为5,递归左子树。当前节点为5,递归右子树。当前节点为2,递归左子树。当前节点为2,递归右子树。

2023-08-07 21:01:18 61

原创 算法通关村第八关——最小深度

这里的关键问题是题目中说的:最小深度是从根节点到最近叶子节点的最短路径上的节点数量,也就是最小深度的一层必须要有叶子结点,因此不能直接用。然后到了当前节点2的程序的最下面,这时min_depth已经为1(因为4返回回来的是1,3返回回来的是2,取最小值为1),返回2。先看左,当前节点4,左右都为空,返回1,min_depth = 1。先看左,当前节点6,左右都为空,返回1,min_depth = 1。再看右,当前节点5,左右都为空,返回1,min_depth = 1。再看右,当前节点3,左右都不为空。

2023-08-05 20:52:20 41

原创 算法通关村第八关——二叉树的所有路径

如果不是叶子节点,那就开始递归,首先左子树,但是在遍历的过程中,要传递的path为当前节点+ '->',这是题目中要求的符号,直到叶子节点,才结束这一分支。如果当前节点的左和右都为null,那就说明到了叶子节点了,那就往结果列表中加入当前节点,并且返回,结束当前路径。LeetCode257: 给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。输入:root=[1,2,3,nu11,5]输出:["1->2->5","1->3"]叶子节点是指没有子节点的节点。

2023-08-03 21:07:33 52

原创 算法通关村第七关——迭代实现二叉树遍历

如果root.right是null的话,因为现在栈中不为空,所以还是会进入循环,但是不会进入压栈的那个循环,这是往结果列表中压入的就是刚开始处理的那个节点的父节点。现在的节点是整个树中最左下角的那个节点,将这个节点弹出,加入结果列表,让root=root.right,然后进入下一层循环。先将从root开始到最左下角的那个节点,按顺序全部压入栈中。中序遍历先访问当前节点,再一层一层向下找左子树,找到最底部,再进行处理。首先,定义一个结果列表,在定义一个栈,进入循环。在迭代法中,使用栈来处理节点上的元素。

2023-07-31 21:25:15 40 1

原创 算法通关村第七关——二叉树的遍历

但是,在树中最需要注意的思想,我认为是把对每一颗子树的处理都当作一个新的树来看,也有点递归的意思。前序遍历:3 9 20 15 7。后序遍历:9 15 7 20 3。前序:在树中先访问当前节点,在访问左节点,最后访问右节点。中序:在树中先访问左节点,在访问当前节点,最后访问右节点。后序:在树中先访问左节点,在访问右节点,最后访问当前节点。就拿上面的这个树来看, 根节点是3,

2023-07-31 20:52:05 98 1

原创 算法通关村第七关——递归

我理解的递归就是套娃,一个套一个,原本是一个很大的问题,但是在我们分块来处理的时候,每一个问题都有相似的地方,这样就可以来套娃了。递归的代码很少,如果能完全把递归理解了,那么后面的东西也就水到渠成了。拿斐波那契数列来看,

2023-07-31 20:40:00 54 1

原创 算法通关村第六关——二叉树的锯齿形层序遍历

LeetCode103题,要求是:给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。在while循环外定义一个isOrderLeft布尔变量,确保当前是从左到右遍历还是从右到左遍历。例如:给定二叉树[3,9,20,null,null,15,7]就是二叉树的层次遍历多加个条件,大致模板还是不变的。

2023-07-31 20:26:52 138 1

原创 算法通关村——如何使用中序和后序来恢复一颗二叉树

中序序列划分:[3 4 8 6 7 5 2] 1 [10 9 11 15 13 14 12]后序序列划分:[8 7 6 5 4 3 2] [10 15 14 13 12 11 9] 1。中序序列划分:[10] 9 [11 15 13 14 12]中序序列划分:[3 4 8 6 7 5] 2。后序序列划分:[8 7 6 5 4 3] 2。中序序列划分:3 [4 8 6 7 5]后序序列划分:[8 7 6 5 4] 3。中序序列划分:[15] 13 [14]后序序列划分:[8 7 6 5] 4。

2023-07-30 20:43:57 84 1

原创 算法通关村第五关——三数之和

第三个数的值等于目标值减去前两个数的和的相反数。为了找到所有符合条件的三元组,代码需要不断地移动第二个数和第三个数的指针。如果它们的和小于目标值,则需要将第二个数的指针右移。外层循环枚举第一个数,内层循环枚举第二个数。同时,为了避免重复解,内层循环在枚举第二个数时,需要保证它和上一个枚举的数不相同。最后,如果找到符合条件的三元组,则将它们加入到结果列表中,并继续寻找下一个符合条件的三元组。如果第二个数和第三个数的指针相遇,则退出内层循环,继续枚举下一个第一个数。输出:[[-1,-1,2],[-1,0,1]

2023-07-28 10:30:22 130 1

原创 算法通关村第五关——Hash和队列

Hash通过散列函数将键映射到固定长度的数组下标,从而实现快速插入和查询。存取时根据key计算出下标index,直接进行操作。所以时间复杂度为O(1)。碰撞是不同的key映射到同一个index的情况,需要处理碰撞。

2023-07-28 09:41:13 240 1

原创 算法通关村第四关——计算器问题

第五层循环,s.charAt(i)为2,进入第一个if,num=2,在第二个if的判断中,满足i == n - 1,进入第三个case,向栈中压入栈顶元素与现在num相乘的值,但是这里的操作是pop栈顶元素,然后与num相乘之后再次压入,现在栈中又两个数,分别是3和4。第四层循环,s.charAt(i)为*号,但是现在的preSign为+号,进入第二个if,进入第一个case,向栈中压入2,preSign = *,num = 0。就拿上面的示例来说,进入循环,3是数字,num = 3,第二个if不满足,

2023-07-28 08:39:33 235 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除