算法与数据结构
算法与数据结构
勿问东西
日拱一卒,功不唐捐
展开
-
快速排序总结
(2)然后,左边和右边的数据可以独立排序。对于左侧的数据,又可以取一个分界值,将该部分数据分成左中右三部分,同样在左边放较小值,中间放等于值,右边放较大值。(3)重复上述过程,可以看出,这是一个递归过程。(1)将小于分界值的数据集中到数组的左边,等于分界值的数据集中到数组的中间,大于分界值的数据集中到数组右边。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。输入: [3,2,3,1,2,4,5,5,6], k = 4。输入: [3,2,1,5,6,4], k = 2。原创 2024-10-04 16:46:49 · 22 阅读 · 0 评论 -
回文子串 & 最长回文子串
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。给你一个字符串 s,找到 s 中最长的回文子串。原创 2024-10-04 16:43:14 · 23 阅读 · 0 评论 -
动态规划总结
对于动态规划问题,可以拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!原创 2024-10-04 16:40:49 · 475 阅读 · 0 评论 -
回溯算法总结
回溯法并不是什么高效的算法,因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。回溯法解决的问题都可以抽象为树形结构,是的,我指的是所有回溯法的问题都可以抽象为树形结构!原创 2024-10-04 16:30:35 · 535 阅读 · 0 评论 -
【leetcode】最小覆盖子串
给你一个字符串 s 、一个字符串 t。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “”。原创 2024-10-04 16:19:00 · 36 阅读 · 0 评论 -
【leetcode】单词拆分
解释: 返回 true 因为 “applepenapple” 可以由 “apple” “pen” “apple” 拼接成。输入: s = “applepenapple”, wordDict = [“apple”, “pen”]解释: 返回 true 因为 “leetcode” 可以由 “leet” 和 “code” 拼接成。输入: s = “leetcode”, wordDict = [“leet”, “code”]注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。原创 2024-10-04 12:14:25 · 47 阅读 · 0 评论 -
【leetcode】无重复字符的最长子串
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。输入: s = “abcabcbb”输入: s = “pwwkew”输入: s = “bbbbb”原创 2024-10-04 12:11:58 · 43 阅读 · 0 评论 -
【leetcode】分割回文串
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是。输出:[[“a”,“a”,“b”],[“aa”,“b”]]返回 s 所有可能的分割方案。输入:s = “aab”输入:s = “a”输出:[[“a”]]原创 2024-10-04 12:04:32 · 28 阅读 · 0 评论 -
【leetcode】接雨水
很明显,较矮的一边,也就是左边的墙的高度,减去当前列的高度就可以了,也就是 2 - 1 = 1,可以存一个单位的水。装水的多少,当然根据木桶效应,我们只需要看左边最高的墙和右边最高的墙中较矮的一个就够了。把正在求的列左边最高的墙和右边最高的墙确定后,然后为了方便理解,我们把无关的墙去掉。求每一列的水,我们只需要关注当前列,以及左边最高的墙,右边最高的墙就够了。较矮的墙的高度等于当前列的墙的高度。较矮的墙的高度大于当前列的墙的高度。较矮的墙的高度小于当前列的墙的高度。同样的,我们把其他无关的列去掉。原创 2024-10-04 12:00:20 · 126 阅读 · 0 评论 -
【leetcode】三数之和
接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i],b = nums[left],c = nums[right]。满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2]注意: 答案中不可以包含重复的三元组。原创 2024-10-04 11:58:05 · 193 阅读 · 0 评论 -
【剑指offer】LRU 缓存
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。原创 2024-10-04 11:51:08 · 68 阅读 · 0 评论 -
【剑指offer】合并 K 个升序链表
合并 K 个升序链表给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6示例 2:输入:lists = [原创 2024-10-04 11:48:48 · 105 阅读 · 0 评论 -
【剑指offer】剪绳子
因此用𝑑𝑝[𝑖]dp[i]表示长度为i的绳子可以被剪出来的最大乘积,那么后续遍历每个𝑗j的时候,我们取最大𝑑𝑝[𝑖]=𝑚𝑎𝑥(𝑑𝑝[𝑖],𝑗∗𝑑𝑝[𝑖−𝑗])dp[i]=max(dp[i],j∗dp[i−j])就好了。动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;一旦分出一段长度为1的小段,只会减少总长度,还不能增加乘积,因此长度为2的绳子不分比分开的乘积大,长度为3的绳子不分比分开的乘积大,长度为4的绳子分成2*2比较大。原创 2024-10-04 11:46:26 · 120 阅读 · 0 评论 -
【剑指offer】和为S的连续正数序列
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。滑动窗口是指在数组、字符串、链表等线性结构上的一段,类似一个窗口,而这个窗口可以依次在上述线性结构上从头到尾滑动,且窗口的首尾可以收缩。我们在处理滑动窗口的时候,常用双指针来解决,左指针维护窗口左界,右指针维护窗口右界,二者同方向不同速率移动维持窗口。数据范围:0<𝑛≤1000<n≤100。返回值:[[2,3,4],[4,5]]原创 2024-10-04 11:43:24 · 59 阅读 · 0 评论 -
【剑指offer】在二叉树中找到两个节点的最近公共祖先
【代码】【剑指offer】在二叉树中找到两个节点的最近公共祖先。原创 2024-10-04 11:39:34 · 23 阅读 · 0 评论