自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法通关村——原来贪心如此简单

每个孩子的饭量不同,对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;1.排序问题:选择排序,拓扑排序 2.优先队列:堆排序 3.赫夫曼压缩编码 4.图里的Prim,Fruskal和Dijkstra算法 5.硬币找零问题 6.分数背包问题 7.并查集的按大小或者高度合并问题或者排序 8.任务调度部分场景 9.一些复杂问题的近似算法。这里可以使用贪心策略,先将饼干数组和小孩数组排序,然后从前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量就可以了。

2023-09-03 13:34:24 96

原创 算法通关村——滑动窗口高级问题

有n条垂线,第i条线的两个端点是(i,0)和(i,height[i]).找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。LeetCode209:长度最小的子数组,给定一个含有n个正整数的数组和一个正整数target.找出该数组中满足其和>=target的长度最小的连续子数组,并返回其长度。设两指针i,j,指向水槽版高度分别为h[i],h[j],此状态下水槽面积为S(i,j).由于可容纳水的高度由两板中的短板决定,因此面积公式为S(i,j)=min(h[i],h[j])*(j-i)

2023-09-03 10:24:24 106

原创 算法通关村——滑动窗口

窗口其实就是两个变量left和right之间的元素,也可以理解为一个区间,窗口大小可能固定,也可能变化,如果是固定大小的,那么自然要先确定窗口是否越界,再执行逻辑处理。:说明这个窗口是移动的,事实上移动的仍然是left和right两个变量,而不是序列中的元素。所谓窗口就是建立两个索引,left和right,并且保持right-left=3,然后一遍遍历序列,一边寻找,每改变一次就标记一下当前区间的最大值就行了。1.如果是固定的,则一般会让你求那个窗口的元素最大最小平均值和最大最小等等类型的问题。

2023-09-01 12:24:36 97

原创 算法通关村——海量规模数据问题的处理方法

解决方法就是把包含20亿个数的大文件用哈希函数分成16个小文件,根据哈希函数的性质,同一种数不可能被散列到不同的小文件上,同时每个小文件中不同的数一定不会大于2亿种,假设哈希函数足够优秀,然后对每一个小文件用哈希表来统计其中每种数出现的次数,这样我们就得到了16个小文件中各自出现次数最多的数,还有各自的次数统计。遍历这40亿个无符号数,遇到所有的数时,就把bitArr响应位置的值设置为1.遍历完成后,再一次遍历bitArr,看看哪个位置上的值没被设置为1,这个数就不在40亿个数中。要求,内存限制为2GB。

2023-08-29 18:36:38 50

原创 算法通关村——位运算在查找重复元素中的妙用

2.如果文件实在太大,无法在内存中放下,则需要考虑将大文件分成若干小块,先处理每个块,最后再逐步得到想要的结果,这种方式也叫做外部排序。如果只有4KB的空间,那么只能寻址8*4*2^10个比特,这个值比32000要大,因此我们呢可以创建32000比特的位向量(比特数组),其中一个比特位置就代表一个整数。题目要求:给定一个数组,包括从1到N的整数,N最大位32000,数组可能还有重复值,且N的取值不定,若只有4KB的内存可用,该如何打印数组中所有重复元素。利用这个位向量,就可以遍历访问整个数组。

2023-08-29 14:18:10 54

原创 算法通关村——解析堆的应用

LeetCode215:给定整数数组nums和整数K,请返回数组中第K个最大的元素。请注意,你需要找的时数组排序后的第K个最大的元素,而不是第K个不同的元素。K多大就建立多大固定大小的堆。只有比根元素大的才让进堆。查找:找小用大,找大用小。排序:升序用小,降序用大。

2023-08-29 12:10:43 47

原创 算法通关村——原来这就是堆

如果直接删掉堆顶,整个结构就被破坏了,所以实际策略是先将堆中最后一个元素和堆顶元素进行替换,然后删除堆中最后一个元素。然后再继续与子树比较,如果有更大的继续交换,直到自己所在的子树也满足大顶堆。堆 一般都是对堆中的数据进行操作都是针对堆顶的元素,即每次都从堆中获得最大值或最小值。大顶堆:任意节点的值均大于等于它的左右孩子,并且最大的值位于堆顶,即根结点处。小顶堆:任意节点的值均小于等于他的左右孩子,并且最小的值位于堆顶,即根节点处。查找:找大用小,大的进,找小用大,小的进。排序:升序用小,降序用大。

2023-08-28 21:28:32 27

原创 算法通关村——幂运算问题解析

LeetCode326:给定一个整数,写一个函数来判断它是否是3的幂次方。如果是,返回true。否则,返回false。LeetCode342:给定一个整数,写一个函数来判断它是否是4的幂次方。如果是,返回true,否则,返回false。LeetCode231:给你一个整数N,请你判断该整数是否是2的幂次方,如果是,返回true,如果否返回false。方法:可以连续对n进行除以2的操作,直到n不能被整除,此时如果n==1,则n是2的幂,否则n不是2的幂。

2023-08-28 17:06:25 40

原创 算法通关村——数字与数学问题解析

LeetCode7:给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。溢出问题是一个极其重要的问题,只要涉及到输出一个数字,都可能遇到。典型的题目有三个:数字反转,将字符串转成数字和回文数。LeetCode1822:给定一个数组,求所有元素的乘积的符号,如果最终答案是负的返回-1,如果最终答案是正的返回1,如果答案是0返回0。LeetCode9:给你一个整数x,如果x是一个回文整数,返回true,否则返回false。将数字本身反转,为了避免数字反转可能导致的溢出问题,可以只反转数字的一半。

2023-08-28 08:25:32 41

原创 算法通关村——字符串问题解析

LeetCode917:给定一个字符串,返回:“反转后的”字符串,其中不是字母的字符都保留在原地,而所有的字母的位置发生反转。LeetCode541:给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。LeetCode242:给定两个字符串s1和s2,请编写一个程序,确定一个字符重新排列后,能否变成另一个字符串。LeetCode387:给定一个字符串,找到它的第一个不重复的字符,并返回他的索引,如果不存在,则返回-1。方法一:使用语言提供的方法实现。

2023-08-27 17:28:21 51

原创 算法通关村——不简单的字符串转换问题

字符串里存放的可以是字母,数字,也可以是特殊字符,字母又可以大写和小写,这就导致字符串有一类常见的转换的题目,这些题目无非就是这几种类型的相互转换。这里没有考察算法的知识,更多是开发中对数据的处理(如[参数校验]等)。ord()函数以一个字符串作为参数返回对应的ASCII数值,是chr()函数或unichr()函数的配对函数。LeetCode709:给你一个字符串s,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。

2023-08-15 11:09:08 33

原创 算法通关村——位运算白银挑战

n的二进制表示的从低到高第i位,在颠倒之后变成第31-i位(0<=i<32),所以可以从低到高遍历n的二进制表示的每一位,将其放到其在颠倒之后的位置,最后相加即可。LeetCode338:给你一个整数n,对于0<=i<=n中的每个i,计算其二进制表示中1的个数,返回一个长度为n+1的数组ans作为答案。LeetCode191:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数位1的个数。LeetCode371:给你两个整数a和b,不适用运算符+和-,计算并返回两整数之和。

2023-08-14 16:52:24 62

原创 算法通关村——位运算青铜挑战

将一个算术右移K位和将这个数除以2^k是不等价的,大部分算法题都将测试数据限制在正数和0的情况,因此可以放心的左移或者右移。机器只有加法,将符号位参与运算,原码的减法不正确,反码真值部分正确,但是+-0没有意义,补码解决了0的符号以及两个编码的问题。位运算主要有:与,或,异或,取反,左移,右移,左移和右移统称为移位运算,移位运算又分为算术移位和逻辑移位。负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1(在反码的基础上+1)负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

2023-08-13 21:36:44 47

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

归并排序简单来说就是将大的序列先视为若干个比较小的数组,分成几个比较小的结构,然后利用归并的思想实现的排序方法,该算法次啊用经典的分治策略(分就是将问题分为一些小的问题分别求解,而治则将分的阶段得到的各答案合在一起)

2023-08-13 19:14:42 27

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

LeetCode215:数组中第K大的最大元素。给定整数数组nums和整数k,请返回数组中第K个最大的元素。请注意,你需要找的是数组排序后的第K个最大的元素,而不是第K个不同的元素。

2023-08-13 19:12:59 27

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

【代码】算法通关村——快速排序。

2023-08-13 12:53:25 48 1

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

返回以该节点为根的子树。第二种情况:nums[pivot]>nums[high],这说明nums[pivot]是最小值左侧的元素,因此我们 可以忽略二分查找区间的右半部分。从左开始找,开始的时候必然时arr[i-1]<a[i],所以只要找到第一个arr[i]>arr[i+1]的位置即可。LeetCode852:数组中的某位位置i开始,从0到i是递增的,从i+1到数组最后是递减的,让你找到这个最高点。当我们遍历到下标i时,如果有arr[i-1]<arr[i]>arr[i+1],那么i就是我们需要找出的下标。

2023-08-11 19:15:03 69 1

原创 算法通关村——透彻理解二分查找

分治法:就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如二分搜索,排序算法(快速排序,归并排序)等等。二分查找就是将中间结果与目标进行比较,因此二分查找可以说是子最典型的分治了。这里的关键是找到目标结果之后不是返回而是继续向左侧移动。找到相等位置向左使用线性查找,直到找到相应的位置。元素存在重复,如果重复则找左侧第一个。常见的使用循环的方式来实现二分查找。

2023-08-11 08:51:37 50 1

原创 算法通关村——轻松搞定二叉树的深度和高度问题

对于node,最大深度自然是左右子节点+1,左右子节点有的可能为空,只要有一个,树的最大高度就是1+1=2.用代码表示就是:int depth = 1 + max(leftDepth, rightDepth)二叉树的深度为根节点到最远叶子结点的最长路径上的节点数。一个高度平衡二叉树定义为:一个二叉树每个节点的左右两个字数的高度差的绝对值不超过1。二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。只有两层的时候一定是平衡的。

2023-08-10 20:42:32 82 1

原创 算法通关村——轻松搞定二叉树的深度优先经典问题

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为Null的节点将直接作为新二叉树的节点。LeetCode112:给你二叉树的根节点root和一个表示目标和的整数targetSum,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和targetSum.LeetCode257:给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。1.比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。

2023-08-10 20:39:55 80 1

原创 算法通关村——迭代实现二叉树的前中后序遍历

【代码】算法通关村——迭代实现二叉树的前中后序遍历。

2023-08-09 19:02:27 39 1

原创 算法通关村——理解二叉树的遍历

LeetCode144:二叉树前序遍历问题,此时给的函数preorderTraversal()就难以直接递归,我们可以自己创建一个。

2023-08-09 19:01:05 63 1

原创 算法通关村——递归

有些情况不一定是触底才开始反弹,而是达到某种要求就要停止,这样需要考虑的情况会比较多。解决这类问题最直接的方式就是枚举,将可能的情况列举一下,再逐步优化。一般是根据题目要求先将能写的写出来,之后再逐步补充,后面在题目里再看。只有列举清楚了才可能将终止条件写完整,确定终止条件对于递归至关重要。递归是我们算法进阶的基础,是必须要掌握的内容。将递推公式和终止条件组合起来,变成完整的方法。1.与树和二叉树相关的大部分问题。3.快速排序,归并排序相关的问题。2.二分查找相关的问题。5.所有动态规划的问题。

2023-08-08 09:09:28 101

原创 算法通关村——原来如此简单

deque支持线程安全、有效内存地以近似O(1)的性能在deque的两端插入和删除元素,尽管list也支持相似的操作,但是它主要在固定长度操作上的优化,从而在pop(0)和insert(0,v)(会改变数据的位置和大小)上有O(n)的时间复杂度。正常执行层次遍历,不管最底层由几个元素,最后一个输出的一定是最底层最右的元素,每一层都是先反转再放入队列,就可以让最后一个输出的是最左的。pop():移除列表中的一个元素(默认最右端的一个元素)并返回该元素的值,如果没有元素,将会报出IndexError。

2023-08-07 11:55:51 53

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

中序: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。第二轮:左子树的根节点为2,右子树的根节点为9。第一轮:后序的最后一个节点为根节点。

2023-08-02 08:54:28 73

原创 算法通关村——队栈的经典算法问题解析

入,此时栈操作时,首先将元素入队到queue2,然后将queue1的全部元素依次出队并入队到queue2,此时queue2的前端的元素即为新入栈的元素,再将queue1和queue2互换,则queue1的元素即为栈内的元素,queue1的前端和后端分别对应栈顶和栈底。思路:将一个栈当作输入栈,用于压入push插入的数据,另一个栈当作输出栈,用于pop和peek操作。每次pop和peek时,若输出栈为空则将输入栈的全部数据一次弹出并压入输出栈,这样输出栈从栈顶到栈底的顺序就是队列从队首往队尾的顺序。

2023-08-01 17:53:36 63 1

原创 算法通关村——队列问题解析

"""返回大小"""

2023-08-01 08:09:20 58 1

原创 算法通关村——栈经典算法问题解析

思路:设计一个数据结构,使得每个元素与其对应的最小值时刻保持一一对应,因此可以使用一个辅助栈,与元素栈同步插入与删除,用于存储与每个元素对应的最小值。LeetCode20:给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。当一个元素要入栈时,我们去当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中。在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出。

2023-07-31 10:49:52 50 1

原创 算法通关村——如何基于数组实现栈

采用顺序表实现的栈,内部以数组为基础,实现对元素的存取操作。在应用中还要注意每次入栈之前先判断栈的容量是否够用,如果不够用,可以进行扩容。栈是很多表达式,符号计算的基础,也是递归的底层实现。Python本身不擅长链表更适合数组方式。

2023-07-30 16:00:36 38 1

原创 算法通关村——双指针的妙用

元素的舒徐可以改变。LeetCode26:给你一个有序数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。给定一个非负整数数组A,返回一个数组,在该数组中,A的所有偶数元素之后跟着所有奇数元素。','.join('abc') 代码的含义是“将字符串abc中的每个成员以字符''分隔开再拼接成一个字符串”,输出结果为:'a,b,c'str表示字符串(字符),item表示一个成员,注意括号里必须只能有一个成员,比如','.join('a','b')这种写法是行不通的。

2023-07-30 09:45:59 24 1

原创 算法通关村——不简单的数组增删改查

能准确处理游标(size还是size-1)和边界等情况是数组算法题最基础重要的问题之一。index = size //为什么要这样,下面不就是在找index的位置了吗,下面的注解也没有看太懂。将给定的元素插入到有序数组的对应位置上:我们可以先找到位置,再将其后元素整体后移,最后插入到空位置上。如果数组是递增的,查找如果相等或者当前位置元素比目标值更大就停下来(自己写的)注意:算法要保证在在数组的首部、尾部和中间位置插入成功。要求删除序列最前,中间,最后和不存在的元素都有效。先查看元素是否存在,存在再删除。

2023-07-27 17:45:36 30 1

原创 算法通关村第二关——指定区间反转问题解析

确定好需要反转的位置(left, right),类似裁缝一样找准位置减下去(pre.next=null,right.next=null)再补回去(pre.next=right,left.next=succ)next.next = pre.next //cur可以吗。将待反转的区域反转(反转链表的子区间)

2023-07-23 09:38:41 24

原创 算法通关村第二关——终于学会链表反转了

next = cur.next的目的是存储下一个节点的位置,因为cur的节点方向将会改变。不带头节点的方式是面试中经常要考的。

2023-07-22 09:43:19 20

原创 编程导航算法通关村第一关——白银教程学习

需要使用两个栈,分别将两个链表的结点入两个栈,然后分别出栈,如果相等就继续出战,一直找到最晚出栈的那一组。将链表元素全部压栈,然后一边出栈,一边重新遍历链表,一边比较,只要有一个不相等,那就不是回文链表了。解题思路:新建一个链表,然后分别遍历两个链表,每次都选最小的结点接到新链表上,最后排完。常用的算法思想有:查找,排序,双指针,递归,迭代,分治,贪心,回溯和动态规划等。常用的数据结构有:数组,链表,队,栈,Hash,集合,树,堆。合并K个链表,有多种方式,例如堆,归并等等。拼接两个字符串,长度相同。

2023-07-21 18:11:58 66 1

原创 算法通关村第一关——链表青铜挑战笔记

(3)在单链表的结尾插入结点:找到最后一个结点,cur.next = node, node.next = null。我们要在目标结点的前一个位置停下来,使用cur.next的值而不是cur的值来判断。2.链表增加元素,首部,中间和尾部分别会有什么问题,该如何处理?3.链表删除元素,首部、中间和尾部分别会有什么问题,该如何处理?(3)删除中间结点:pre.next = cur.next。(1)删除表头结点:head = head.next。(2)删除最后一个结点:找到要删除的结点的前驱。

2023-07-18 10:20:45 67 1

空空如也

空空如也

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

TA关注的人

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