- 博客(20)
- 收藏
- 关注
原创 哈希表--LeetCode最长连续序列
文章介绍了一种寻找数组中最长连续序列的算法。首先将数组转换为HashSet去重,然后遍历集合寻找序列起点。当找到一个不存在前驱的数字时,开始向后统计连续序列长度,记录最大值。该算法时间复杂度为O(n),每个元素仅被访问一次;空间复杂度为O(n),使用了HashSet存储元素。核心思路是通过HashSet快速查找,避免重复计算,确保线性时间复杂度。
2025-06-18 21:36:40
306
原创 单调队列--LeetCode绝对差不超过限制的最长连续子数组
一直在判断以L作为子数组左边界出发的子数组长度(必须以L作为左边界的子数组长度)很简单,差不超过限制,就是求一个子数组中最大值和最小值的差值不超过限制。扩一次,判断是否达标,记录长度。解题步骤比较复杂的时候,可以将其拆成几部分,每部分作为一个方法。如果不达标,停,L右扩。如果一个窗口右扩导致不达标,那么再右扩更不达标;如果一个窗口已经达标,那么L怎么缩依然达标。L=0的时候,扩,求一个答案,L=1的时候,扩,求一个答案,L=2的时候,扩,求一个答案,达标,R右扩,不达标L右扩。如果达标,继续R右扩。
2024-12-05 14:20:43
339
原创 二分法--LeetCode第 N 个神奇数字
分析题目中相关数据n,发现它是1-n满足条件的正整数个数,由此可设f(x)为1-x满足条件的正整数个数,x越大,f(x)越大,单调递增,可以根据a,b和最小公倍数计算得到f(x),f(x)=x/a+x/b-x/lcm(a,b)x最小为min(a,b),最大为n*min(a,b),因为要找的是第n个,所以[a,n*a]一定有n个满足条件的,[b,n*b]也一定有n个满足条件的,所以找两者中更小的就一定可以找到第n个。=0,a%b=30 递归。2.gcd(10,0) a=10,b=0,b==0,返回a。
2024-12-05 10:49:51
373
原创 寻找左边界的二分查找--LeetCode在 D 天内送达包裹的能力
分析题目中相关数据days,发现它是天数,由此可设f(cap)为天数,cap越大,f(cap)越小,单调递减,由于。根据weights计算得到f(cap)x最小为weights数组最大值,因为每次至少装一件走,最大为weights所有数之和。target是f(cap)==days的最小cap,所以向左搜索。1.确定自变量x,k的单调函数f(x),要求的target。求的是船的最低运载能力,自变量就是船的最低运载能力cap。target就是f(cap)==days的最小cap。时间复杂度:O(Nlogn)
2024-12-03 17:39:12
283
原创 寻找左边界的二分查找--LeetCode爱吃香蕉的珂珂
x最小为1,最大为piles里面的最大数,因为再大的话也没用了,吃完了一堆不能再多吃,可以使用循环找出piles数组里的最大值,这里直接设置成题目给的范围的最大值+1。分析题目中相关数据h,发现它是时间,由此可设f(k)为时间,k越大,f(k)越小,单调递减,可以根据piles计算得到f(k)1.确定自变量x,k的单调函数f(x),要求的target。求的是珂珂吃香蕉的最小速度,自变量就是珂珂吃香蕉的速度k。target是f(k)==h的最小k,所以向左搜索。target就是f(k)==h的最小k。
2024-12-03 17:37:42
498
原创 递归--LeetCode全排列
因为List类型变量是引用类型变量,传的是地址,所以每次递归使用add()方法改变的结果会影响到回上一层之后甚至以后的运算(String path可以做参数是因为每次并没有改变path本身,传的参数是path+"")纵向上看,其前的数字在之前的递归中可能和当前数字交换过位置,若当前数字可以和其前数字交换位置,则可能会换回去,所以不能和其前数字交换;若log(b,a)>d,时间复杂度为O(N^log(b,a))形如T(N)=a*T(N/b)+O(N^d)的递归函数,log(b,a)是以b为底a的对数。
2024-12-02 23:02:58
816
原创 递归求解--牛客字符串的全部子序列
对于s中的每个字符都有"取"和"不取"两种选择,且对于字符串"abc"来说,"cb"不是其子序列,也就是说子序列是按字符串原顺序一层一层筛选得出的,由此可以使用递归来解决递归求解--牛客字符串的全部子序列
2024-12-02 17:39:28
422
原创 链表--LeetCode环形链表
null,就可能出现fast==null或fast.next==null但slow!=null继续循环的情况,这时再执行fast=fast.next.next;使用快慢指针循环遍历链表,快指针每次走两步,慢指针走一步,通过检测是否相遇判断链表中是否有环。使用快慢指针循环遍历链表,快指针每次走两步,慢指针走一步,相遇就有环,不相遇无环。遍历链表,使用哈希表存放访问过的节点,通过判断有无重复节点确定是否有环。时间复杂度:O(n)空间复杂度:O(n)时间复杂度:O(n)
2024-12-01 16:41:02
333
原创 链表--LeetCode删除链表中的节点
且链表中所有数值都唯一,所以可以使用node节点存储node.next的数据,然后删除node.next节点即可,满足题目"删除节点并不是指从内存中删除它 "首先明确一下题意:在无法访问head节点的情况下删除head链表中的一个节点node,已知链表中所有数值都是唯一的,且node不是最后一个节点。由于node节点不是最后一个节点,所以它的下一个节点node.next一定存在,对于节点node.next,可以获取到它的前一个节点,所以。要删除一个节点,必须要知道该节点的前一个节点。时间复杂度:O(1)
2024-12-01 14:52:47
367
原创 链表--LeetCode反转链表
链表是由一组节点ListNode对象连接而成的数据结构,要访问其中一个数据只能顺序访问,不能像数组一样直接访问。遍历单向链表拿到的数据一定是从前向后的顺序,创建单向链表也是从前向后的顺序一个一个将节点连接起来,所以只能在遍历拿到数据之后对数据进行处理使其反转,再一个个创建节点连接成新链表,即为反转链表。,所以设置临时节点temp和p分别代表当前尾节点和要插入的新节点,通过temp.next=p;利用两个指针实现链表反转。时间复杂度:O(n)空间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(1)
2024-12-01 13:50:41
794
原创 位移求解LeetCode--只出现一次的数字 II
由图可看出,将数组中的数用二进制表示并记下每一位1的数量(和),用数组count表示,然后取余3(大多数数字的出现次数)得到的新count数组就只和剩下的那个数result(出现次数和其他数不同的数)有关了,2.新count数组每一个不为0的位,刚好对应result二进制表示为1的位。1.每个int型的数的二进制表示都可以看做一个32位数组,每位是0或1。,对于数组[3,5,3,3],可以表示成下图所示。,最后通过位移得到result即可。时间复杂度:O(n)
2024-11-30 22:44:15
439
原创 异或求解LeetCode--只出现一次的数字 III
本题中可以使用result&(-result)拿到result二进制表示最右侧的1,由于result是x^y的结果,所以x和y在这一位上的数字是不同的,可以根据这个特点将数组分为两组,x和y必定不在一组,这时两组的异或结果即为x和y,只需求出其中一组的异或结果result1,用result^result1表示另一组结果即可。题目中只有两个数出现1次(假设两数分别是x和y),其余数都出现2次,所以整个数组异或的结果是result=x^y,那么我们怎么把结果分成原始的两个数呢?,根据这个特点,可以通过。
2024-11-30 21:58:31
450
原创 异或求解LeetCode--只出现一次的数字
根据异或的性质:0^n=n和n^n=0以及异或满足交换律和结合律可知,一个数组中偶数个相同数字异或的结果为0,奇数个相同数字异或的结果为该数字,所以要找出现奇数次的数字,只需求一下整个数组异或的结果即可。4.结合律:(a^b)^c=a^(b^c)3.交换律:a^b=b^a。时间复杂度:O(n)
2024-11-30 21:05:26
397
原创 位运算求解LeetCode--颠倒二进制位
32位时,还有第五步16v16,&1111 1111 1111 1111 0000 0000 0000 0000和&0000 0000 0000 0000 1111 1111 1111 1111,即&ffff0000和&0x0000ffff,此时也可以不&,直接位移(因为直接位移16位就能把一半移出去,和做与运算效果一样)16位时,还有第四步8v8,&1111 1111 0000 0000和&0000 0000 1111 1111 位移8位,即&0xff00和&0x00ff。时间复杂度:O(1)
2024-11-29 22:28:08
10349
原创 位运算求解LeetCode--数字范围按位与
由于right在不断变小,逼近left,所以每次循环得到的新right也是left-right区间里的值,也是遍历n次的情况下需要参与运算的,而消除最右侧的1后得到的新right的形式是从这个1的位置开始及后面都为0,如果left=新right,那么新right不再参与运算,所有要参与运算的都已运算,得到的结果刚好和新right一致,所以最终可以使用新right作为结果。
2024-11-29 21:09:20
450
原创 位运算求解LeetCode--3的幂
如果一个数是3的幂,那么在int范围内,它一定是1162261467的因数(1162261467是int范围内3的最大幂,3的19次幂),所以只需判断该数字是否是1162261467的因数即可。如果并不知道int范围内3的最大幂值,可以使用循环求解。不断将该数字除以3,直到它不再是3的倍数,判断是否为1,若为1则是3的幂,不为1则不是。在一定范围内,一个数字的所有幂值是该数字最大幂值的因数。方法2时间复杂度:O(logn)方法1时间复杂度:O(1)
2024-11-29 17:47:25
383
原创 位运算求解LeetCode--2 的幂
若有多个1,且还是2的倍数,那这些1应该合并为更高位的1个1,而不是以多个1的形式出现,矛盾,所以不可能有多个1。如果一个数是2的幂,那么该数的二进制表示形式一定是最高位为1,其余位为0,且最高位的1即为该数字全部。时间复杂度:O(1)
2024-11-29 17:04:28
320
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅