- 博客(20)
- 收藏
- 关注
原创 Leetcode 239滑动窗口最大值
暴力方法,遍历一遍的过程中每次从窗口中在找到最大的数值,是$O(n × k)$的算法会超时。想通过优先级队列解决,但是大顶堆每次只能弹出最大值,此时不能保证大顶堆维护的都是滑动窗口里的数值。此时就需要自定义一种队列,在滑动窗口移动的时候,既能移除元素,也能继续添加元素,并且还需保证,返回的队首元素是当前窗口的最大值。队列不需要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素即可,同时保证队里的元素数值是由大到小的。所以需要一个单调队列。设计单调队列的时候,pop,和push操..
2022-05-27 22:53:22
242
原创 Leetcode刷题总结——字符串
一、反转字符串二、替换空格替换空格以后,字符串所占的长度会比原字符串多,所以我们首先需要扩充数组到每个空格替换成“%20”之后的大小。然后从后向前替换空格,(双指针法)一个指针指向新长度的末尾,一个指针指向旧长度的末尾之所以选择从后向前,是因为从前向后填充是O(n^2)的算法,因为每次添加元素都要将添加元素之后的所有元素向后移动。注:很多数组填充类的问题,都可以预先给数组扩容到填充后的大小,然后再从后向前进行操作。1)不用申请新的数组。2)从后向前填充元素,避免了从.
2022-05-27 13:18:37
483
原创 Leetcode刷题总结——链表
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链接的入口节点称为链表的头结点也就是head。数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。 链表是通过指针域的指针链接在内存中各个节点。所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。学会自己构造一个链表C++会默认生成一个构造函数,
2022-05-17 09:49:37
444
1
原创 Leetcode 24两两交换链表中的节点
https://leetcode.cn/problems/swap-nodes-in-pairs/solution/liang-liang-jiao-huan-lian-biao-zhong-de-jie-di-91/方法一:递归递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。链表中的其余节点的两两交换可以递归地实现。在对链表中..
2022-05-16 21:14:52
299
原创 Leetcode 23合并k个升序序列
方法一:逐步遍历以后合并,即从前到后两两合并方法二:分治合并1)将k个链表配对并将同一对中的链表合并;2)第一轮合并以后,k个链表被合并为k/2个链表,平均长度为2n/k,接着再分成k/4,k/8个链表等;3)重复这一过程,直到我们得到了最终的有序链表。方法三:使用优先队列合并(这里采用小顶堆)C ++中的优先队列是STL中的派生容器,它仅考虑最高优先级元素。队列遵循FIFO策略,而优先队列根据优先级弹出元素,即,优先级最高的元素首先弹出。它在某些方面..
2022-05-16 16:27:58
356
原创 Leetcode刷题总结——单调栈
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时可以用单调栈。1、2、3、4、方法一:双指针法首先从头遍历所有的高度,其次在for循环中求左右两边最高的柱子(时间复杂度 o(n^2)超时)双指针法有重复计算之处,在方法二中的动态规划中得到解决方法二:动态规划把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight)。避免重复计算...
2022-05-04 21:27:06
576
原创 Leetcode刷题总结——数组
数组是存放在连续内存空间上的相同类型数据的集合。数组下标都是从0开始的。 数组内存空间的地址是连续的因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。数组的元素是不能删的,只能覆盖。一、二分查找这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件。二分法逻辑比较简单,但容易写乱,比如是while(left<right) or w
2022-05-01 22:15:49
571
原创 Leetcode刷题总结——二叉树
二叉树节点的定义:1、二叉树的遍历前序遍历(中左右)、中序遍历(左中右)、后序遍历(左右中)递归三要素:1)确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。2)确定终止条件:写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。3).
2022-04-06 22:08:12
556
原创 Leetcode刷题总结——滑动窗口
(参考:Loading...)1. 无重复字符的最长子串(3) 2. 重复的DNA序列(187) 3. 存在重复元素 II(219) 4. 替换后的最长重复字符(424) 5. 找到字符串中所有字母异位词(438) 6. 滑动窗口中位数(480) 7. 最长和谐子序列(594) 8. 子数组最大平均数 I(643) 9. K 个不同整数的子数组(992) 10. 可获得的最大点数(1423) 11. 可见点的最大数目(1610) 12. 学生分数的最小差值(1984)...
2022-03-19 19:46:54
258
原创 LeetCode 3无重复字符的最长子串
给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。思路和算法(滑动窗口)以示例一中的字符串 abcabcbb 为例,找出从每一个字符开始的,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案。对于示例一中的字符串,我们列举出这些结果,其中括号中表示选中的字符以及最长的字符串:以(a)bcabcbb 开始的最长字符串为(abc)abcbb;以a(b)cabcbb 开始的最长字符串为a(bca)bcbb;以ab(c)abcbb 开始的最长字符串为ab(cab)cbb;...
2021-11-13 15:25:26
85
原创 LeetCode 2两数相加
给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0开头。(最后的进位部分容易忘记!!)...
2021-11-13 14:40:30
298
原创 LeetCode 19删除链表的倒数第N个结点
给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。在对链表进行操作时,一种常用的技巧是添加一个哑节点(dummy node),它的 next 指针指向链表的头节点。这样一来,我们就不需要对头节点进行特殊的判断了。例如,在本题中,如果我们要删除节点 y,我们需要知道节点 y 的前驱节点 x,并将 x 的指针指向 y 的后继节点。但由于头节点不存在前驱节点,因此我们需要在删除头节点时进行特殊判断。但如果我们添加了哑节点,那么头节点的前驱节点就是哑节点本身,此时我们就只需要考虑通用的情..
2021-11-13 14:15:13
71
原创 LeetCode 299猜数字游戏
你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下:写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示:猜测数字中有多少位属于数字和确切位置都猜对了(称为 "Bulls", 公牛),有多少位属于数字猜对了但是位置不对(称为 "Cows", 奶牛)。也就是说,这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。给你一个秘密数字secret 和朋友猜测的数字guess ,请你返回对朋友这次猜测的提示。提示的格式为 "..
2021-11-13 13:46:34
2866
原创 LeetCode 268丢失的数字
给定一个包含[0, n]中n个数的数组nums,找出[0, n]这个范围内没有出现在数组中的那个数。掌握四种解题方法1、排序法(数组排序之后,即可根据数组中每个下标处的元素是否和下标相等,得到丢失的数字。)2、哈希集合(首先遍历数组 nums,将数组中的每个元素加入哈希集合,然后依次检查从 0到 n的每个整数是否在哈希集合中,不在哈希集合中的数字即为丢失的数字。由于哈希集合的每次添加元素和查找元素的时间复杂度都是 O(1),因此总时间复杂度是 O(n)。空间复杂度:O(n),其...
2021-11-07 16:08:33
161
原创 LeetCode 1218最长定差子序列
给你一个整数数组arr和一个整数difference,请你找出并返回 arr中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。动态规划d=difference时间复杂度:O(n)空间复杂度:O(n)...
2021-11-07 16:02:25
107
原创 LeetCode 367 有效的完全平方数
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。进阶:不要 使用任何内置的库函数,如sqrt 。方案
2021-11-07 12:09:04
90
原创 LeetCode 557反转字符串中的单词III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。1、使用额外空间开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置。随后,根据单词的起止位置,可以将该单词逆序放到新字符串当中。如此循环多次,直到遍历完原字符串,就能得到翻转后的结果。2、原地解法直接在原字符串上进行操作,避免额外的空间开销。当找到一个单词的时候,我们交换字符串第一个字符与倒数第一个字符,随后交换第二个字符与倒数第二个字符……如此反.
2021-10-31 20:44:21
102
原创 LeetCode 189旋转数组
给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。解决方法:1、使用额外的数组用 n表示数组的长度,遍历原数组,将原数组下标为 i的元素放至新数组下标为 (i+k)mod n 的位置,最后将新数组拷贝至原数组即可。该方法空间复杂度为O(n)2、环状替换环状替换思路3、 数组翻转方法二与方法三的空间复杂度都是O(1)...
2021-10-30 20:59:59
83
原创 LeetCode 二分查找 35搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。
2021-10-30 17:10:24
143
原创 LeetCode 有关整数反转 7 整数反转 9 回文数
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围[−231,231− 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)解题思路:(设一个新的变量纪录翻转后的数字,将x的末尾数字加入新变量中,直到x为0)Notes:环境不允许存储64位整数,因此需要对翻转后的数字进行一个大小的限制,学会分析数学分析如下...
2021-10-30 15:53:15
108
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人