自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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滑动窗口最大值

使用两个指针和数组实现双端队列,找滑动窗口最大值。时间复杂度:O(N)

2024-12-05 14:19:15 244

原创 二分法--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二分查找

题目明确告诉我们是要在一个升序数组里找一个值,所以可以使用二分解决while循环的条件

2024-12-03 17:35:10 166

原创 递归--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--找到缺失的数字

若一组数全部异或的结果为x,部分异或的结果为y,那么剩余部分异或的结果为x^y。时间复杂度:O(n)

2024-11-30 21:17:03 193

原创 异或求解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关注的人

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