自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 力扣 240.搜素矩阵II

比较巧妙的排除法,首先从矩阵的右上角开始找起,如果右上角元素x比target大,那么说明右上角这一列都不会存在target,因此这一列就不需要再遍历;如果x比target小,那么就说明,右上角这一行都不会存在target,排除这一行。使用常规方法对每一行进行二分查找,看是否存在target。编写一个高效的算法来搜索。

2024-06-09 01:27:59 475 1

原创 力扣 74.搜索二维矩阵

两次二分,首先查找行,找到第一列的某一行的首元素是小于等于target的最大值,如果能找到这么一行,就说明target就在该首元素所在行,因为相邻的两行之间是首尾相接之后,按照大小排列的,因此如果找到一行的首元素是小于等于target的最大值,那么这一行之前的元素一定都比target小,这一行之后的元素都会大于target,因为该行首元素都小于等于target了,该行的上一行更会小于target了,而且每一行的尾元素大于下一行的首元素,不可能出现相等的情况。给你一个满足下述两条属性的。

2024-06-08 02:05:33 626

原创 力扣 48.旋转图像

但是如果直接通过遍历数组来进行该公示的应用,那么之前已经置换过的位置会影响没有置换过的位置,因此还需要将原始数组保存起来,进行置换的时候 就将辅助数组的元素放置在原始数组的对应位置,这样就避免了原始数组被覆盖的可能。旋转之后,A->B B->D D->C C->A,实现的时候逆着来,即先重置A位置为C,再重置C位置为D,以此类推,但是需要先保存A位置的初始值,这样才能将B位置置为A。这样做的的问题:空间复杂度很大,考虑是否可以实现原地反转,即就在当前数组上进行翻转。使用另一个矩阵来旋转图像。

2024-06-07 02:19:07 523

原创 力扣 54.螺旋矩阵

击败了1.2%的用户,不过这坨代码终究是过了。,返回矩阵中的所有元素。

2024-06-05 21:01:40 511

原创 力扣 73.矩阵置零

常规思路,先循环遍历数组,记录哪一行有0(row[i]是否等于0),哪一列有0(col[i]是否等于0),再依次遍历数组的时候,根据记录的标志,如果该行有0,就将该行全部数组元素都置为0,列也是一样的,但是存在的问题,空间复杂度是O(m+n),因为实际实现的时候会要开辟两个集合来存放记录的某一行是否为0,某一列是否为0,最坏的情况下,每一行每一列都是0,那么由于记录集合的使用,导致空间占用O(m+n),因此常规思路的空间复杂度较大,考虑改进,在不添加空间的前提下进行是否存0的记录。

2024-06-05 14:10:12 385

原创 力扣 41.缺少的第一个正整数

对于这种数组交换来实现每一个元素都在自己应该在的位置的想法一开始觉得不能实现,因为觉得交换之后现在位置上的元素可能还是不满足要求,再进行交换,会不会将之前排好序的位置打乱,实际上,这样的担忧是不必要的,因为每个元素只有一个确定的位置,要么能够交换就交换的放置,要么因为在当前数组放不下该元素或者该元素小于1就不交换,总之,只要在while判断条件下进行的交换总能将新交换到当前位置的元素再交换到正确的位置,直到新交换到当前位置的元素已经不满足要交换的条件了,继续遍历下一个元素进行新一轮的交换即可。

2024-06-05 11:44:43 670

原创 力扣 238.除自身以外数组的乘积

不难发现,计算ans[3]的时候计算的nums[0]*nums[1]*nums[2],在计算ans[4]的时候其实不用算,只要在上次计算出来的nums[0]*nums[1]*nums[2]基础上乘以nums[3]即可形成ans[4]中 “1”之前的完整表达式的值;同理,“1”之后也有一样的规律,计算出来ans[4]的nums[5]*nums[6]之后 再去计算ans[3]的"1"之后的表达式的值时候,就只需要在ans[4]计算出来的nums[5]*nums[6]基础上再乘上nums[4]。

2024-05-31 02:19:51 611 1

原创 力扣 189.轮转数组

使用反转数组来实现,首先将整个数组反转,然后将[0,k mod n -1]位置的数组反转,接着将[k mod n , n-1]位置的数组反转,一开始自己写的时候没有考虑到,k>n的情况,实际上题解一写的时候也没有考虑到,题解二实现的时候发现参考答案中有对k>n情况的考虑,因此才意识到需要k mod len。四个参数分别是:原数组,原数组的起始下标,目标数组,目标数组的起始下标,要复制多少个元素。:最容易的思路,用另外一个数组来接受轮转之后的值,之后将新数组赋值给nums。,将数组中的元素向右轮转。

2024-05-30 02:31:33 420

原创 力扣 56.合并区间

这道题中,要求合并能合并的区间,并且讲合并之后的结果返回,那么考虑1 2 3哪种情况不能合并,显然是3,即遍历到的区间的开始时间大于结果数组中最后一个区间的结束时间,结果数组中存储的区间已经是把当前便利的区间之前能合并的区间都合并了之后的结果,并且由于初始化的时候就将所有待合并区间按照开始时间从小到大排过序了,所以结果数组中保存的合并之后的区间也是从小到大排序的,自然结果数组中最后一个区间才是唯一有可能和当前数组进行合并的数组。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

2024-05-29 02:20:59 550

原创 力扣 53.最大子序和

至于为什么这样写dp方程就能保证可以找到最大值,因为我们上面说过,现在的思路就是在遍历的时候将每一个元素都作为一次子数组的最后一个位置,判断在每一个元素作为子数组的最后一个元素的时候所能形成的最大子数组和是多少,我们可以分成两种情况来考虑,一种是单独一个当前元素构成一个子数组,还有一种是当前元素加上当前元素之前的最大子数组和,就是我的dp方程所展示的,而其中的连续问题已经在上一段讨论过了,故而问题解决。因此可以看出,遍历完当前位置元素,当前位置元素一定会在新的子数组的最后一个位置出现,这样就保证了连续。

2024-05-28 02:27:34 417

原创 力扣 76.最小覆盖子串

如果缩小之后,刚好缩小出去的key所对应的value值 (其实就是该元素在当前窗口中有几个) 小于need中该元素要求的value值,那么就需要将valid--,指示当前窗口还有元素没有收集够。2、当window更新之后,查看现在该字符的value是否等于need中对应字符的value,如果相等,说明现在完成了在s中查找t进度的1/t,valid++;1、window中存储的有效字符的个数,新移入的字母如果有效,那么window中对应key的value应该++;因此没有符合条件的子字符串,返回空字符串。

2024-05-27 02:21:51 717

原创 力扣 438.找到字符串中所有字母异位词

由于我们需要判断的是当前窗口中的字符串是否是一个p的异位词,即当前窗口中的每一种“有用”元素的数量是否和p中每一种元素数量相对应,并且p中的元素种类和窗口中的元素种类也是一致的,“有用”:p是abc,但是现在窗口中是sbc,那么s的数量我们其实不需要记录。在缩窗口之前,当前窗口的大小等于p的大小,此时就能来判断当前窗口圈住的内容是否是一个满足题目要求的异位词,具体判断过程就是看valid是否等于p中种类数,是的话,就说明当前窗口记录的是一个异位词。的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

2024-05-27 01:38:43 672

原创 力扣 239.滑动窗口最大值

新元素入队列,将新元素的下标添加进队列,现在队列维护的就是后续滑动窗口的时候可能成为窗口最大值的元素下标,因为不可能在滑动窗口的时候 成为窗口最大值的元素已经在新元素入队列之前,通过步骤2让新元素和当前队列中的每一个元素比较过了,将小于新元素的旧元素全部从队列中删除了,换句话说,就是将新元素入队列之后,不可能成为最大值的元素全部删除了,每一次将一个元素入队列之前,都将小于该元素的值移除队列,就可以保证队列的首元素在没过期之前一直是需要求的最大值,减少了比较次数。你只可以看到在滑动窗口内的。

2024-05-26 02:12:20 400

原创 力扣 560.和为k的子数组

子数组是数组中元素的连续非空序列。

2024-05-25 02:03:08 329

原创 力扣 3.无重复字符的最长字串

初始时,在temp字符串中保存第一个字符,假设现在从第二个字符位置开始遍历,如果当前位置的字符 x 在temp中已有记录,那么说明现在以第一个字符开头的子串已经是最长的无重复元素的子串了,那么就更新count,然后从temp中找出字符 x 出现的位置,然后从该位置之后截取字符串,重新更新字符串temp,接着将下一个要添加进来的字符拼接在字符串末尾,继续向后遍历下一个字符。从左到右遍历每一个位置的字符,temp中保存的是当前计算出来的最长无重复字符的子串,count中保存的是无重复元素的最长字串长度。

2024-05-23 22:18:35 383 1

原创 力扣 42.接雨水

题解1:按行来求,一行一行算,先计算出最高的“墙”的高度,然后从最高的那行开始遍历,对于每一行来说,比如第5行(首行是第1行),从左到右遍历一行,如果现在该行某一位置墙的高度大于等于5,我们就记录下来,假设用 l 记录,继续向后遍历,发现又出现一个墙的高度大于等于5的位置,用 r 记录下来,那么我们现在就可以确定,l 和 r之间肯定是低洼,可以蓄水的地方,并且由于我们只关心这一行,因此,蓄水的容量就是 r-l+1。的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。个非负整数表示每个宽度为。

2024-05-23 02:41:55 1531

原创 力扣 15.三数之和

第二种:如果现在的三个数中第一个数k已经大于0,说明后面两个数也肯定大于0(因为我们已经将数组进行从小到大的排序了),那么三数相加不可能再等于0,这种情况也需要省略,即这要出现k>0的情况,就说明循环遍历可以结束了,之后不会再有满足要求的数组元素组合了。题解:还是需要遍历全部的可能结果,但是可以使用双指针进行剪枝,这里考虑循环遍历数组,将数组的每一个元素作为三个数字中的第一个元素,然后查找所有的可能,进行计算,但是首先需要对数组进行排序,保证不重不漏。注意,输出的顺序和三元组的顺序并不重要。

2024-05-21 10:58:36 384

原创 JAVA基础(三)

中已经做过解释,多线程首次调用getInstance时,其中一个通过5和6,来到8,但是8实际操作分为三步,若没有使用volatile就会使三步操作中初始化和赋值(就是将变量指向一个内存,使变量的值不为null,但是实际该内存中并没有东西)颠倒顺序,这时,如果有另一个线程走到5,就会认为instance不为null,直接return,可能会导致程序出现未定义的错误,比如一个线程利用该什么也没有的变量执行其他操作,就会得到错误的结果。多线程下,上几次锁就得对应的释放几次锁,这样其他线程才能获取到该锁。

2024-05-19 18:43:17 723 1

原创 力扣 11. 盛水最多的容器

假设现在h=<h1,现在容量是h*(x1-x) 那么x到x1之间的全部元素都不需要遍历,因为由x1移到x1-1位置时,相当于宽减小,高最大也还是h,即容量是h*(x1-1-x),也就是说x到x1之间的每一个容器容量都不会大于x和x1形成的容器容量,因此只要h<h1时,既不需要计算x到x1之间的值了。假设现在h>h1,现在容量是h1*(x1-x) 那么当x到x1之间的某个位置(假设是x1-1)高度(假设是h2)大于h1时才有必要计算,因为如果小于h1,现在计算出来的容量相当于高度和宽度都减小了,即。

2024-05-19 18:35:46 470 1

原创 力扣 283.移动零

和题解1类似,两遍遍历,第一遍将非0元素挤到前面,每找到一个非零元素,就将其放在j位置,j初始是0,然后j++,代表下一个非零元素要放在哪里,第二遍遍历将按需排好的非零元素的下一个位置(就是j)到数组末尾全部置为0(因为现在已经将全部非零元素排在数组最前面了)移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。,编写一个函数将所有。

2024-05-18 02:58:41 291

原创 力扣 128.最长连续序列

为什么不判断一下x-2,x-3...是否存在,因为x-1存在的话,必然比遍历x得出的结果大1,但是x-2,x-3...存在的话,未必能得出该结果,假如不存在x-1,即现在数组是0,1,2,3,5,6 x=5时,x-2存在,但是x-1不存在,数组已经不连续了,自然判断x-2没有什么用了。:我直接排序数组,然后从第二个元素开始遍历数组,dp数组初始置为1,当前位置元素值等于前一位置元素值加1,说明形成递增排序,如果相等,dp[i]=dp[i-1],最后记录的最大dp值就是要求的值。给定一个未排序的整数数组。

2024-05-17 02:09:36 279

原创 力扣 49.字母异位词分组

实现,key值就是升序之后的字符串,遍历strs字符数组,每次对一个字符串进行排序,在map中寻找是否有对应键值的List,没有就new一个,之后put(新key,新List)到map中,如果之前就有对应键值的List,那么取出List,将新的同源str字符串加入其中。又存在要保存没有排序的同源字符串到同一个List中,因此考虑使用。解释题目:没看懂题目要求,直接看了评论,其实就是现在要找到给出的字符串数组中,除了字母排序不一样的其他全部相同的字符串,放到一个List中,找出这样的全部List进行输出。

2024-05-16 01:48:14 422

原创 JAVA基础(二)

在这种情况下,虽然类已经被加载到内存中,但是并没有显式地创建该类的实例),给外部类中写一个方法,在该方法中实现创建内部类对象,然后调用内部类方法和属性,再在主函数中调用外部类的方法即可。->泛型方法,可以使用类声明的泛型,也可以使用自己方法声明的泛型,但是不允许使用类内未声明并且方法内也未声明的泛型。直在定义内部类的方法中创建内部类对象,通过内部类对象来调用内部类方法属性,再在主函数中调用外部类的方法即可。->要访问局部内部类,可以在外部类定义内部类的方法中实例化内部类对象,从而调用内部类的方法和属性。

2024-04-04 16:36:09 1196

原创 JAVA基础(一)

分析,Animal a = new Cat() 实现a指向cat,之后又让c->被向上转型成的cat,因此合理。

2024-04-01 12:08:56 1374

《自顶向下 深入理解计算机网络》

归档,仅供参考

2024-02-14

空空如也

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

TA关注的人

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