- 博客(30)
- 收藏
- 关注
原创 算法通关村--盘点面试大热门之区间问题
当总油量 大于等于 消耗量时,应该可以跑完一圈,在每一段时,各个加油站的剩油量相加一定是大于等于0的,每个加油站的剩余量 = 加油量 - 耗油量,i从0开始累加,一旦和小于0,说明[0,i]区间不能作为起始位置,必须从 i + 1开始。输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]你从其中的一个加油站出发,开始时油箱为空。解释:新区间[4,8] 与[3,5],[6,7],[8,10]重叠,因此合并成为[3,10]
2023-09-13 00:12:49
100
原创 算法通关村--原来贪心如此简单
第4位顾客那里,我们收取一张10美元的钞票,并返还5美元。而且贪心的题目没有固定的套路,一题一样,好在大部分贪心算法的题都不是特别难,因此贪心的学习方法就是“直接做题,不考虑贪不贪心”。解释:你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。在柠檬水摊上,每一杯柠檬水的售价为5美元,顾客排队购买你的产品,(按账单bills支付的顺序)一次购买一杯。当收取10美元时,需要找零5美元,如果没有5美元面值的钞票,则无法正确找零。
2023-09-10 23:38:29
109
原创 算法通关村--原来滑动窗口如此简单
滑动窗口实际上就是双指针的一种特殊场景,由于这类方式能很好的解决一些特定场景的问题,所以就有了“滑动窗口思想”。
2023-09-06 00:51:21
99
原创 算法通关村--解析堆在数组中找第K大的元素的应用
学习了堆,那么又该如何用堆解决问题呢?之前在快排的学习中,使用递归+快排解决了在数组中找第K大的元素,现在,试着用堆来解决。
2023-09-02 23:12:49
35
原创 算法通关村--数组实现加法问题解析
给定一个整数,写一个函数来判断它是否是3的幂次方,如果是,返回true;给你一个整数n,请你判断该整数是否是2的幂次方。给定一个有整数组成的非空数组所表示的非负整数,在该数的基础上加一。如果存在一个整数x使得 n == 2^x,则认为n是2的幂次方。整数n是3的幂次方需满足:存在整数x使得n == 3^x。输入:a = ”1010“,b = ”1011“输入:digits = [4,3,2,1]输入:digits = [1,2,3]输入:a = “11”,b = ”1“输出:[4,3,2,2]
2023-08-30 23:18:48
65
原创 算法通关村--不简单的字符串转换问题
字符串本身不是一种数据结构,但由于本身的特殊性,可以产生一些特定的算法题。在链表、数组等结构中,元素之间没有语义的关联,但是字符串不同,几个字母组合在一起就是一个单词。字符串可以存放字母、数字、特殊字符等。
2023-08-24 22:29:41
59
原创 算法通关村--数组中第K大的数字
请注意,你需要找的是数组排序后,第k个最大的元素,而不是第k个不同的元素。给定整数数组nums和整数k,请返回数组中第k个最大的元素。输入:[3,2,3,1,2,4,5,5,6], k = 4。输入:[3,2,1,5,6,4], k = 2。学习了快速排序,用例题来加深对快排的理解。先对数组进行排序,然后去找第k个数。
2023-08-14 22:47:04
34
原创 算法通关村--快速排序
快速排序,有称划分交换排序。通过一趟排序将待排记录分隔成两个独立部分,其中记录的一部分关键字比另一部分的关键字小,则可分别对这两部分继续排序,以达到整个序列有序。2.重新排序数列,将比基准小的元素摆在基准前面,比基准大的元素摆在基准后面。1.从数列中选择一个元素,作为“基准”(pivot)以{26,53,48,15,13,46,32,15}3.递归排列比基准小的子序列和比基准大的子序列。
2023-08-13 00:12:31
57
原创 算法通关村--二分查找在搜索中的应用
基于二分查找,可以拓展出许多算法问题。在前面的学习中,我们可以发现许多题使用前序、后序或者层次遍历都可以解决,但几乎没有中序遍历的,这是因为前后序遍历与中序有不一样的特征,中序遍历可以和搜索树结合在一起,而前后序不行。下面我们来研究一下中序搜索的问题。
2023-08-09 23:32:21
43
原创 算法通关村--透彻理解二分查找
常见的查找算法有顺序查找、插值查找、斐波那契查找、树表查找、分块查找、哈希查找等等。其中二分查找、插值查找一级斐波那契查找可以分为一类——插值查找。而插值查找和斐波那契查找实在二分查找的基础上的优化查找算法。今天,我们就来详细了解一下二分查找。凡是涉及到在排好序的地方查找都可以用二分来优化查找效率。二分查找就是将中间结果与目标进行比较,一次去掉一半。可以使用循环或者递归来实现二分查找。
2023-08-07 22:42:06
133
原创 算法通关村--轻松搞定最小深度
最小深度从根节点到最近叶子节点的最短路径上的节点数量,也就是最小深度的一层必须要有叶子节点。输入:root = [2,null,3,null,4,null,5,null,6]输入:root = [3,9,20,null,null,15,7]如果左子树为空,右子树不为空,说明最小深度为1+右子树的深度。如果右子树为空,左子树不为空,说明最小深度为1+左子树的深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。如果左右子树都不为空,返回左右子树深度最小值+1。给定一个二叉树,找出其最小深度。
2023-08-06 23:00:40
53
原创 算法通关村--原来如此简单
广度优先遍历又叫层次遍历。层次优先遍历就是从根结点开始,先访问根节点下面一层全部元素,在访问之后的层次。整个过程可以用队列来实现,首先根节点入队,然后根节点出队,接着把根节点的左右孩子节点依次入队保存到队列中,接着出队一个元素,在把这个元素的左右孩子保存入队,依次类推,最后将所有节点出队,这就是整个层次遍历的过程。接下来,用题来深入理解层次遍历。
2023-08-02 23:46:47
123
原创 算法通关村--如何使用中序和后序来恢复一颗二叉树
二叉树的性质和链表本质相似,比链表多了一个指针,如果是二叉树,只需要在链表的定义上增加一个指针。int val;如果是N叉树,又该怎么去定义呢?就是将节点指向一个List就行。int val;
2023-08-02 00:21:12
81
原创 算法通关村--n数之和问题解析
先将数组排序,固定最左边的指针first,双指针second,third分别设在数组(first+1,nums.length-1)两端,通过双指针交替向中间移动,记录nums[first] + nums[second] +nums[third] = 0 时的nums组合。先遍历,轮到2,然后用9 - 2 = 7,在哈希表里找,显然,哈希表中没有找到7,就把当前的数字2和索引以键值对形式存入到哈希表中,然后遍历7,用 9 - 7 = 2,在表找,可以找到数字2 ,返回即可。输入:nums = [0,1,1]
2023-07-31 23:41:41
26
原创 算法通关村--Hash问题解析
存放7时,由于模除取余为0,这时位置为空,可以直接存入,存放8时,取余为1,这时位置已满,所以向后寻找,直到走到索引为3时,位置为空,所以将8存放到3中,同理9存放到索引为6的位置。在上面的例子中,可以发现Hash中很多位置可能要存放两个或者多个元素,这时,使用单纯的数组行不通,这种两个不同的输入值,根据同一散列函数计算出的散列值相同的现象叫做碰撞。开放定址法就是一旦发生冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。若要继续存放7,8,9时,又该怎么做呢?
2023-07-30 23:25:28
58
原创 算法通关村--括号匹配问题解析
首先将所有的符号存到哈希表中,左半边做key,右半边做value。遍历字符串,如果遇到左半边符号就入栈,遇到右半边符号就与栈顶的符号比较,若不匹配则返回false,否则返回true。给定一个只括号‘(’,‘)’,‘{’,‘}’,‘[’,‘]’,的字符串s,判断字符串是否有效。3.每个右括号都有一个对应的相同类型的左括号。1.左括号必须用相同类型的右括号闭合。2.左括号必须以正确的顺序闭合。初步学习了栈,现在用一道题去深入理解栈。我们来研究一个经典的问题--括号匹配。输入:s=“(){}[]”
2023-07-28 23:11:22
82
原创 算法通关村--双指针的妙用
前面学习了数组基本操作,今天学习双指针在数组中的应用。所谓的双指针其实就是两个变量,不是真的指针。首先定义两个指针slow、fast。其中slow表示当前位置之前的元素都是不重复的,fast指针一直向后找,直到找到与slow位置不一样的,找到后就将slow向后移动一个位置,并将arr[fast]赋值给arr[slow],之后,之后fast继续向后找,循环执行,找完后,slow之前的元素就是单一的,这样就大大简化了数组去重的流程。了解了双指针后,将双指针应用到实际中。
2023-07-27 00:13:36
39
原创 算法通关村--不简单的数组增删改查
例如{1,2,3,4,5,0,0},删除4后变为{1,2,3,5,1.不同语言,初始化数组不同,c语言每个位置都是一个随机数,java中,默认为0,python可以直接指定。用索引来标识每项数据在数组中的位置,通常索引从0开始,可以根据索引快速访问数组中的元素。增加元素时,首先找到要加元素的位置,然后将其后面元素整体右移,最后将其插入到位置上。,0,0},因为元素的数量用size来记录,所以最后一个元素不会访问到。删除元素时,首先要判断要删除的元素是否在数组中,然后再进行删除。2.创建时直接进行初始化。
2023-07-25 23:54:27
57
原创 算法通关村第二关--指定区间反转问题解析
上回了解了链表的反转,接下来深入了解下链表指定区间的反转。指定区间反转比链表的反转稍微难一点,但也差不多,这里采用2种方法解决,1.头插法 2.穿针引线法。
2023-07-24 01:27:10
57
原创 算法通关村第一关—链表经典问题之合并两个有序链表笔记
解题:判断两个链表listA,listB都不为空时,比较listA,listB哪个链表节点的值更小,将较小的值放入到新的链表中,然后将对应的节点向后移一位。若listA,listB有相同的节点,先接listA的节点,再接listB的节点,若listA为空时,直接将listB的节点连接到新链表;将两个排列有序的链表合并成一个链表有两种方式:1.创建一个新的链表,比较两个链表,按照从小到大(从大到小)的顺序,将节点依次放入到新链表中;2.将一个链表的节点拆下来 ,按照顺序插入到另一个链表中。
2023-07-17 11:39:37
42
原创 算法通关村第一关--链表青铜挑战笔记
链表是一种链式存储的数据结构,链表节点结构为:链表的结构为:其中data用来存放数据,next存放指向下一个数据的地址。构建一个单链表单链表构建有两种方法:1.头插法;2.尾插法。头插法:数据插入到链表的表头。尾插法:数据插入带链尾。
2023-07-16 17:16:37
482
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人