- 博客(126)
- 收藏
- 关注
原创 【哈希】Leetcode 217. 存在重复元素
使用set集合完成元素的存储,当我们将当前元素插入到集合单中,如果insert的返回值的pair.second等于false说明当前元素已经存在,反之元素在集合中存在
2024-04-29 15:45:54 121
原创 【哈希】Leetcode 面试题 01.02. 判定是否互为字符重排
直观的想法:我们找到一个字符串的全排列,然后对比当前的排列是否等于另一个字符串。如果两个字符串如果互为排列,所以我们知道两个字符串对应的字符出现的个数相同,那么就可以排列成另一个字符串
2024-04-28 15:22:17 297
原创 【哈希】Leetcode 两数之和
我们希望让这个数组有序,然后再寻找的时候可以很快的找到是否存在这个target - nums[i],这里需要返回的是下标,所以需要一个数据结构保存key:nums AND val:index,因此我们想到了哈希表
2024-04-28 15:15:43 467
原创 【链表】Leetcode K个一组翻转链表
翻转n个链表我们使用头插法,注意:当第一组链表翻转完成之后,我们就不能在使用上一次的头插法的头结点了,就需要在新的链表的尾结点使用头插法,所以我们每一次在翻转当前组链表的时候需要记录翻转完成之后的尾结点,这个尾结点特别好找,就是当前链表组的首节点,使用prev变量记录下来就行。
2024-04-26 20:41:39 415
原创 【链表】Leetcode 合并k个升序链表
注意:遍历一次vector后现在的队列里面全保存的当前的首节点,所以我们之后不在需要遍历vector了,因为取出当前的top之后,我们让当前top节点的之后向后移动一位,然后再push到堆里,只有当堆为空的时候才是所有的链表都遍历完成的时候。
2024-04-26 20:09:50 408
原创 【链表】Leetcode 两数相加
我们这里设置一个头结点,然后遍历两个链表,使用一个flag记录相加的结果和进位,如果两个链表没有走到最后或者进位不等于0,我们就继续遍历处理进位;如果当前的链表都遍历完成了,判断当前的进位是否>10,然后处理是否需要添加进位结点
2024-04-22 20:39:22 395
原创 【归并】Leetcode 交易逆序对的总数
还是使用分治算法的思想:我们可以先将数组分成两块,先求出左边部分的逆序对,右边部分的逆序对和一左一右的逆序对,三个数量相加就是当前数组中的所有逆序对;其次我们在求子数组逆序对的时候,可以把排序添加上,如果添加上排序,那么求左右部分的逆序对的时候就会很方便,只需要将下标相减即可
2024-04-21 09:34:08 339
原创 【归并】Leetcode 排序数组
使用归并算法排序数组,我们先在数组中寻找一个mid点,然后把数组分成了两部分,我们先排左部分,排左边部分的时候有需要将当前的子数组分成两部分,继续循环,直到当前子数组的长度为1的时候,我们直接返回,排右边部分;将排好的左右部分进行有序数组的合并,合并完成之后将子数组填充到当时一段区间中的原数组当中去
2024-04-21 09:04:03 537
原创 【分治】Leetcode 数组中的第K个最大元素
堆排序:1. 寻找最后一个节点的父亲,依次向上遍历,完成小堆的建立;2. 从最后一个元素开始,和堆顶的数据做交换,此时最小的数据在对后面,然后对剩下的区间重新完善小堆
2024-04-19 16:23:43 828
原创 【分治】Leetcode 排序数组
我们这里使用三指针,将数组分成三块:key,如果当前指针指向的数字key,就让swap(nums[--right], nums[i])。然后继续对key的区间进行排序
2024-04-18 20:31:09 200
原创 【分治】Leetcode 颜色分类
如果当前的nums[i] == 0,我们就让nums[++left] 和 nums[i++]位置上的数字做交换,这里的i是可以向前移动的,因为++left位置上的数字一定是1。如果nums[i] == 2, swap(nums[–right], nums[i])如果当前的nums[i] == 1,i++即可。
2024-04-18 17:28:38 322
原创 【位运算】Leetcode 消失的两个数字
我们将这两个数组异或在一起,最后的结果就是a ^ b(缺失的两个数字)的结果,这两个缺失的数字一定是不相同的,所以我们就寻找他们第一个比特位是1的那个位置,异或的原理是:相同为0, 不同为1,按照这个位置将数组划分成两部分,一部分是这一位上是1的,另一部分是这一位上是0的,然后将两个数组的两个部分异或在一起,就得到缺失的两个数字。
2024-04-15 22:26:18 558
原创 【位运算】Leetcode 只出现一次的数字 ||
nums中要么一个数字出现三次,一个数字出现一次,按照比特位来说只可能出现上面的四种情况: 3n个0 + 0 或者 3n个0 + 1 或者 3n个1 + 0 或者 3n个1 + 1,它们相加的结果依次是0, 1, 3n, 3n+1,让当前这个比特位相加的结果%3可以的看出结果和只出现一次的数字上面的比特位一样
2024-04-14 11:40:58 209
原创 【位运算】Leetcode 两整数之和
异或的本质就是无进位相加,但是我们需要处理进位,就需要知道哪一位上有进位,再让无进位相加的结果 + 进位即可,在重复这个过程,当进位等于0的时候,说明相加的过程已经结束
2024-04-14 11:11:20 149
原创 【位运算】Leetcode 丢失的数字
按照上面的代码,比如当前在[0,4]区间中寻找确实的数字,首先将ret = 0 ^ 1 ^ 2 ^ 3 ^ 4;之后,再让ret = ret ^ 0 ^ 1 ^ 3 ^ 4;得到ret = 2;
2024-04-13 10:56:48 211
原创 【Linux】应用层协议:HTTP
在之前的文章中我们实现了一个网络版本的计算器,在那个计算器中揉合了协议定制以及序列化反序列化的内容,我们当时也自己定制了一套协议标准,比如请求和响应的格式应该是什么?如何读到一个完整的报文?支持的运算符有什么?等等我们都有自己的标准。那么有没有其他大佬针对应用层的某些使用场景,已经提前给我们写好了协议软件呢?有,这个协议就是HTTP协议,我们当时的协议仅仅是针对计算场景所设计的,而HTTP协议主要是针对web场景所设计的。
2024-04-13 10:05:37 2265
原创 【前缀合】Leetcode 连续数组
细节问题:1. 这里的哈希表的value存的是下标,因为需要找到最长的子数组的长度 2. 遇到重复的,不用将当前的位置和sum更换进Hash,因为在此时的[0,i]区间里已经寻找到了一段[0,j]区间的和也等于sum,所以左边的长度越小,就能找到结果
2024-04-12 15:55:57 286
原创 【前缀合】Leetcode 和可被 K 整除的子数组
0~i这一段区间是sum,为了寻找一段区间能够被k整除,所以看一下(sum - x) % k是否能被整除,由同余定理得出:sum % k == x % k,因此我们只需要寻找这一段区间中有几个余数等于sum % k的属于需要将负数取余情况代入。
2024-04-12 15:20:39 221
原创 【前缀合】Leetcode 和为k的子数组
前面滑动窗口里面有一道题和这个题很相似,它是求出和为k的最短子数组的长度,但是这道题不能使用滑动窗口,因为虽然找到一段子数组的和等于k,但是这道题里面存在0和负数,可能这一段区间里面还有一段子数组也等于k。
2024-04-11 16:47:15 325
原创 【前缀积】Leetcode 除自身以外数组的乘积
我们可以使用两个空间保存当前位置的左边积和右边积,需要注意的地方初始的dp表需要初始化为1,如果是0则无法得到结果,因为此处是乘法
2024-04-11 16:16:00 257
原创 【前缀合】牛客网 二维前缀和
因为数组的下标是从1开始的,我们设置dp表的含义也就是当前位置到[1][1]这一段区域的总和,因此我们需要将dp表的扩建和nums表的扩建容量都设置成多加一行和一列,这样两个数组的下标才可以对应。
2024-04-10 17:21:56 305
原创 【前缀合】牛客网 前缀和
本题的意思就是:第一行输入数组长度 和 查询次数;数组的下标从1开始; 第二行输入数组数据; 剩下的行数输入计算的下标范围
2024-04-09 23:41:29 122
原创 【二分查找】Leetcode 寻找旋转排序数组中的最小值
我们可以发现旋转后的数组是有这样一个顺序特征:1.要么是旋转长度次,刚好还是原来的数组2.要么一定存在一段一段的升序区间,再其中一段的升序区间中就存在最小值。
2024-04-08 17:04:52 253
原创 【二分查找】Leetcode 寻找峰值
我们按照顺序判断每个数字是否是当前的峰值,如果是直接返回,如果不是继续寻找。如果寻找的数组末尾还没有寻找到,那么就是数组的最后一个元素。如果当前的nums[i] < nums[i+1] 说明i左侧不一定会出现峰值,因为它是上升趋势,峰值一定会出现在i+1的右侧区域。反之,如果当前的nums[i] > nums[i+1] 说明i左侧一定会出现峰值,但是i+1右侧不一定会出现,因为它是下降趋势的。又因为题目中说明没有一个合理的i,存在num[i] == nums[i+1],因此我们不需要对此情况进行判断。
2024-04-08 15:52:49 301
原创 【二分查找】Leetcode 山脉数组的峰顶索引
这到题使用暴力枚举的查找方法发现这段数组是有二段性的,峰顶左边的一段区间是一段递增区间,右边的一段区间是一段递减区间
2024-04-07 15:02:05 212
原创 【二分查找】Leetcode 搜索插入位置
注意这道题有一个细节地方需要注意:如果现在target没有在nums中出现,并且目前的target是nums中最大的那一个,此时我们使用的二分算法只能够寻找到数组的最后一个索引位置。因此,需要我们手动在最后判断一下,如果最后一个索引位置的数字 < target,那么就需要返回最后一个索引位置+1的索引位置。
2024-04-07 14:36:20 247
原创 【Linux】协议定制+序列化和反序列化
通过微信聊天的例子,我们知道了,协议其实就是结构化数据,是客户端和服务端都知道的一种结构化数据,所以需要创建Request和result两个结构上图所示代码是Request,包含两个操作数x和y,以及操作符op,运算表达式的形式如1+1。网络请求Request是由客户端发送的,但是网络端也必须要知道Request中的内容,如x就表示第一个操作数y就表示第二个操作数,op表示计算的类型。Request就是客户端和服务端之间的一个协议。
2024-04-06 21:27:39 1663
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人