![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
力扣刷题
卍暴力出奇迹卍
这个作者很懒,什么都没留下…
展开
-
力扣381. O(1) 时间插入、删除和获取随机元素 - 允许重复
bool remove(int val) 如果存在,从集合中移除一个 val 项。bool insert(int val) 将一个 val 项插入到集合中,即使该项已经存在。// 初始化一个空的集合。int getRandom() 从当前的多个元素集合中返回一个随机元素。// getRandom 应该返回 1 或 2,两者的可能性相同。// 返回 true,因为集合不包含 1。// 返回 false,因为集合包含 1。// 返回 true,因为集合不包含 2。// 返回 true,因为集合包含 1。原创 2024-02-29 00:02:59 · 932 阅读 · 0 评论 -
力扣300最长递增子序列
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。解释:最长递增子序列是 [2,3,7,101],因此长度为 4。给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。输入:nums = [10,9,2,5,3,7,101,18]输入:nums = [7,7,7,7,7,7,7]输入:nums = [0,1,0,3,2,3]原创 2024-02-24 22:02:27 · 463 阅读 · 1 评论 -
双指针算法经典题
解法:先把数组排序,用循环每次固定一个数,然后用一对反向指针固定其它两个数,分别从第一个数的下一个数和最后一个数开始移动,要注意的是第一个数发现重复了要跳过,只要三个数相加等于0,就是一种情况,然后去除和第二个数或者第三个数相等数字的情况,然后就是当三个数相加小于0,第二个数的指针往右移,如果大于0就第三个数的指针往左移。给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!输出:[[-1,-1,2],[-1,0,1]]原创 2024-02-22 23:38:02 · 335 阅读 · 0 评论 -
数据结构经典应用题-大小根堆
思路:创建一个大根堆和一个小根堆,默认第一个数放入大根堆,然后加入数字的时候判断,如果当前数字大于大根堆堆顶就放入小根堆,否则还是放入大根堆,一旦两个堆之间的差距大于等于2,就要把多的那堆的堆顶元素放入另一堆,如果是奇数数量的数字,默认中位数在多的那一堆的堆顶元素,如果是偶数数量,就是两个堆的堆顶元素相加除以2。// 返回 1.5 ((1 + 2) / 2)如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。例如 arr = [2,3] 的中位数是 (2 + 3) / 2 = 2.5。原创 2023-07-27 20:41:16 · 392 阅读 · 0 评论 -
力扣234回文链表的三种解法
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true;否则,返回 false。进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?这是一道经典的链表题目,我将用三种解法依次进阶解决。输入:head = [1,2,2,1]链表中节点数目在范围[1, 10。输入:head = [1,2]原创 2023-04-17 20:41:04 · 142 阅读 · 1 评论 -
力扣647 回文子串-马拉车算法
思路:马拉车算法,首先对字符串进行填充改变 前面加"$#“,每个字符中间加一个”#“,新字符串末端加”!",定义一个f数组来维护不同中心的回文子串的最大半径,维护一个回文串最大区间[l, r],然后从1开始枚举新字符串,如果当前中心在前面的区间内,分两种情况,一是半径不超过r,此时f[i]可以取关于[l,r]中心点对称的左边的f[l + r - i],而是半径超过r,就先取到r的距离为f[i],超过的部分再后面暴力枚举。解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”原创 2023-03-23 17:06:39 · 254 阅读 · 0 评论 -
力扣3无重复字符的最长子串-滑动窗口解法
思路:用一个HashSet来存储每个字符保证不重复,然后不断枚举左指针和右指针,右指针初始值为-1,每次左指针移动一位,就移除set中的一个字符(0位置除外),然后右指针不断移动,并且添加字符,直到出现重复为止,之后就用右指针和左指针的距离去取最大值。解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。输入: s = “abcabcbb”原创 2023-03-15 16:35:35 · 332 阅读 · 0 评论 -
力扣567字符串的排列
用两个数组统计两个字符串在s1字符串长度下每个字符出现的次数,相当于维护一个长度为s1字符串长度的窗口。否则就从s1长度开始,继续遍历一个s1长度的s2字串,然后新进入的字符s2的统计数组在相应字符出现次数加1,出去的字符减1,不断判断两个数组是否相等,相等就找到满足条件的排列。给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。否则,返回 false。输入:s1 = “ab” s2 = “eidbaooo”输入:s1= “ab” s2 = “eidboaoo”原创 2023-03-13 18:39:31 · 60 阅读 · 0 评论 -
力扣525连续数组
思路:前缀和+哈希表,对数组中的0做特殊处理假定为-1,原问题就转化为求最长的连续子数组,其元素和为0,然后计算前缀和可以很快算出一个区间子数组的和,用哈希来存储当前为某一个和的下标,就比如碰到1就++,碰到0就–,哈希表来维护这个和,要注意默认放一个{0,-1}进哈希表,表示空的前缀的结束下标为-1,之后每遍历一个下标就利用哈希表维护,更新最大长度。说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。原创 2023-03-08 18:48:42 · 48 阅读 · 0 评论 -
力扣560和为K的子数组
思路:前缀和+哈希表。一个连续子区间[j,i]的和==k相当于是前缀和[i] - 前缀和[j]==k,所以进一步把问题转换成前缀和[i] - k == 前缀和[j],也就是去找有多少个前缀和[j]在前缀和i之前,这时候又可以用哈希表来记录前缀和[j]的数量,要注意的是特殊情况,当第一个nums[0]就等于k,后面就无法取map,所以令map有个默认值{0,1}输入:nums = [1,1,1], k = 2。输入:nums = [1,2,3], k = 3。原创 2023-03-07 17:43:29 · 84 阅读 · 0 评论 -
力扣713乘积小于k的子数组
设置两个指针i和j,先固定左端点i,枚举右端点j,当一个窗口内的子数组乘积大于等于k时,条件开始不满足,这时候可以变动窗口,也就是把左端点的数除去,然后左端点右移,满足条件的窗口,子数组数量为j-i+1,要每次加上这个数量。解释:8 个乘积小于 100 的子数组分别为:[10]、[5]、[2],、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。输入:nums = [10,5,2,6], k = 100。输入:nums = [1,2,3], k = 0。原创 2023-03-06 16:11:37 · 65 阅读 · 0 评论 -
力扣209长度最小的子数组
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …思路:利用滑动窗口,定义两个指针为窗口的开始和结束,同时指向0位置,然后加到sum,end不断后移,sum大于等于target时,开始更新子数组最小长度,然后把start减掉,start后移。输入:target = 11, nums = [1,1,1,1,1,1,1,1]输入:target = 7, nums = [2,3,1,2,4,3]输入:target = 4, nums = [1,4,4]原创 2023-03-04 19:36:19 · 371 阅读 · 0 评论 -
力扣318最大单词长度乘积
如果不存在这样的两个单词,返回 0。输入:words = [“abcw”,“baz”,“foo”,“bar”,“xtfn”,“abcdef”]输入:words = [“a”,“ab”,“abc”,“d”,“cd”,“bcd”,“abcd”]输入:words = [“a”,“aa”,“aaa”,“aaaa”]解释:这两个单词为 “abcw”, “xtfn”。解释:这两个单词为 “ab”, “cd”。words[i] 仅包含小写字母。解释:不存在这样的两个单词。原创 2023-03-01 14:55:59 · 372 阅读 · 0 评论 -
力扣338比特位计数
思路:首先明确:奇数的二进制数1的个数一定比前一个偶数多1,而偶数的二进制数1的个数等于除以2之后的二进制数1的个数,因为除以2就是右移把最后一位0消除,所以可以得到状态转移方程。给你一个整数 n ,对于 0原创 2023-02-27 14:38:56 · 48 阅读 · 0 评论 -
力扣29-两数相除
整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2。给你两个整数,被除数 dividend 和除数 divisor。注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−2。解释: 7/-3 = -2.33333…,向零截断后得到 -2。,向零截断后得到 3。输入: dividend = 10, divisor = 3。输入: dividend = 7, divisor = -3。− 1 ,则返回 2。原创 2023-02-25 15:56:26 · 399 阅读 · 0 评论 -
力扣-删除有序数组中的重复项
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。将最终结果插入 nums 的前 k 个位置后返回 k 。不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。判题标准:系统会用下面的代码来原创 2023-02-24 16:58:02 · 355 阅读 · 0 评论