首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

14种模式搞定面试算法编程题(PART I)

1、滑动窗口 滑动窗口模式用于对给定数组或链表特定窗口大小执行所需操作,例如查找包含所有1最长子序列。滑动窗口从第一个元素开始,每次向右移动一个元素并根据要解决问题调整窗口长度。...问题输入是线性数据结构,链表、数组或字符串 题目要求查找最长/最短子字符串、子数组或所需值 举个栗子 来看看实际应用滑动窗口解决问题 滑动窗口最大值(剑指offer)[2] 滑动窗口中位数(LEETCODE...这种解决方案虽然确实可行,但是对时间和空间复杂度来说明显是低效 。在许多情况下,使用双指针可以帮助你找到具有更好空间或时间复杂度解决方案。 ?...] 接雨水(LEETCODE)[7] 长度最小子数组(LEETCODE)[8] 3、快慢指针 也被称为“龟兔算法”,基本思想是使用两个指针以不同速度在数组或链表中移动。...应用场景 需要找到给定集合组合或排列问题 举个栗子 子集系列(LEETCODE)[23] 字母大小写全排列(LEETCODE)[24] 列举单词全部缩写(LEETCODE)[25] 单词子集(LEETCODE

2K11
您找到你想要的搜索结果了吗?
是的
没有找到

前端学数据结构与算法(十二):有趣算法 - 多指针与滑动窗口

如果和正好等于0,那就找到了一种组合结果;如果大于0,就r--让r指针向中间移动;如果小于0,就l++让l指针向中间移动,该解法复杂度是O(n²)。...// 返回最大窗口平均值 }; 674 - 最长连续递增序列 ↓ 给定一个未经排序整数数组,找到最长且连续递增子序列,并返回该序列长度。...max }; 209 - 长度最小子数组 ↓ 给定一个含有n个正整数数组和一个正整数s,找出该数组中满足其和≥s长度最小连续子数组,并返回其长度。...当找到一个连续子数组后,让左侧窗口向右滑动,减去最左侧值,减小窗口内和,也让窗口右侧滑动。如果又找到了一个满足条件子数组,与之前子数组长度进行比较,更新最小窗口大小即可。...0 : size // 如果size等于初始值,表示没有符合要求子数组,否则有找到 }; 3 - 无重复字符最长子串 ↓ 给定一个字符串,请你找出其中不含有重复字符 最长子串 长度

56010

【算法专题】滑动窗口

长度最小子数组 题目链接 -> Leetcode -209.长度最小子数组 Leetcode -209.长度最小子数组 题目:给定一个含有 n 个正整数数组和一个正整数 target 。...让滑动窗口满足:从 i 位置开始,窗口内所有元素和小于 target (那么当窗口内元素之和第一次大于等于目标值时候,就是 i 位置开始,满足条件最小长度)。...0 : ans; } }; 为何滑动窗口可以解决问题,并且时间复杂度更低? 这个窗口寻找是:以当前窗口最左侧元素(记为 left1 )为基准,符合条件情况。...时间复杂度:虽然代码是两层循环,但是我们 left 指针和 right 指针都是不回退,两者最多都往后移动 n 次。因此时间复杂度是 O(N). 2....中间塞了 k 个 0 ;因此,我们可以把问题转化成:求数组中一段最长连续区间,要求这段区间内 0 个数不超过 k 个。

9510

有点难度,几道和「滑动窗口」有关算法面试题

题目描述 给定一个字符串,请你找出其中不含有重复字符 最长子串 长度。...未查找到,则将该元素插入到record中,而后查看record长度是否为k + 1 如果此时record长度是否为k + 1,则删减record元素,该元素值为nums[i - k] 如果遍历完整个数组...nums未查找到则返回false 动画描述 动画描述 代码实现 // 时间复杂度: O(n) // 空间复杂度: O(k) class Solution { public: bool containsNearbyDuplicate...长度最小子数组 题目来源于 LeetCode 上第 209 号问题:长度最小子数组。题目难度为 Medium,目前通过率为 37.7% 。...滑动窗口右端 R 继续移动,停止于第四个元素 4,此时和位 10 ,但最优长度仍然为 4 图片 3 代码实现 // 滑动窗口思路 // 时间复杂度: O(n) // 空间复杂度: O(1) class

87610

【数据结构和算法】寻找数组中心下标

下面是一些常见使用前缀和算法题目以及解题思路: 2.1.1 最长递增子序列长度 题目描述:给定一个无序数组,求最长递增子序列长度。 解题思路:可以使用前缀和和单调栈来解决这个问题。...最后,栈中剩余元素即为最长递增子序列起始位置,计算长度即可。 2.1.2 寻找数组中第 k元素 题目描述:给定一个无序数组和一个整数k找到数组中第k元素。...如果枢轴左边元素个数小于k,则在左边子数组中继续查找;如果枢轴左边元素个数大于等于k,则在右边子数组中继续查找。最后,当找到k元素时,返回该元素即可。...2.1.3 最长公共子序列长度 题目描述:给定两个字符串,求最长公共子序列长度。 解题思路:可以使用动态规划算法来解决这个问题。...4.2 方法一:前缀和 时间复杂度 O(N): 其中 N 为数组 nums 长度

11810

【c++算法篇】滑动窗口

目录 `1.长度最小子数组` `2.无重复字符最长子串` `3.最大连续1个数 III` `4.将 x 减到 0 最小操作数` `5.水果成篮` `6.找到字符串中所有字母异位词` `7.串联所有单词子串...在移动 left 指针同时,我们可以更新相关计算结果,累积和或计数器等 在整个过程中,我们通常会记录窗口相关一些信息,窗口大小、窗口内元素总和、窗口中最大或最小元素等,可能还会记录与问题计算要求相关最优结果...,在这样问题中,滑动窗口技术能够有效地找到解决方法,同时保证时间复杂度最少。...:如果 len 还是 INT_MAX,这意味着没有找到满足条件子数组,函数返回 0;否则,返回找到最短连续子数组长度 这个时间复杂度是 O(n),因为每个元素最多被访问两次:一次是右指针向右移动时...,找到最长连续子数组(窗口),其中只包含最多两种不同元素(即果树种类)。

6100

前端刷完这12道滑动窗口,是不是就可以出山面试了

无重复字符最长子串// 3. 无重复字符最长子串分析1. 这里求最长子串,证明有很多长度不一子串,那么就是有很多大小不一窗口,所以属于窗口不固定滑窗题2....+1时间复杂度O(n), 这一次是值跑一次,l 基本靠跳空间复杂度 (O(k)) k 是字符窗中不同字符集合值var lengthOfLongestSubstring = function(s) {...长度最小子数组分析这里求是符合要求连续数组长度,所以这个长度是不确定,也就是窗口长度不确定;这里求是一个窗口累加值 sum >= target, 一旦满足要求就要压缩窗口,得到最小符合要求连续数组长度...,然后将 l 指针跳转到最小变更下标,然后再次进行区域扩充时间复杂度 O(n),n 是 nums 长度; 空间复杂度 O(k)var longestOnes = function (nums, k...将 x 减到 0 最小操作数分析其实这道题截止条件可以转成,设置一个窗口,使得 total - sum === x ,其中 total 就是数组总和,sum 就是窗口里和;这样移除值就刚好等于

44850

前端刷完这12道滑动窗口题目,就可以出山面试了

无重复字符最长子串// 3. 无重复字符最长子串分析1. 这里求最长子串,证明有很多长度不一子串,那么就是有很多大小不一窗口,所以属于窗口不固定滑窗题2....+1时间复杂度O(n), 这一次是值跑一次,l 基本靠跳空间复杂度 (O(k)) k 是字符窗中不同字符集合值var lengthOfLongestSubstring = function(s) {...长度最小子数组分析这里求是符合要求连续数组长度,所以这个长度是不确定,也就是窗口长度不确定;这里求是一个窗口累加值 sum >= target, 一旦满足要求就要压缩窗口,得到最小符合要求连续数组长度...,然后将 l 指针跳转到最小变更下标,然后再次进行区域扩充时间复杂度 O(n),n 是 nums 长度; 空间复杂度 O(k)var longestOnes = function (nums, k...将 x 减到 0 最小操作数分析其实这道题截止条件可以转成,设置一个窗口,使得 total - sum === x ,其中 total 就是数组总和,sum 就是窗口里和;这样移除值就刚好等于

43530

前端刷完这12道滑动窗口,就可以出山面试了_2023-03-01

无重复字符最长子串 // 3. 无重复字符最长子串 分析 1. 这里求最长子串,证明有很多长度不一子串,那么就是有很多大小不一窗口,所以属于窗口不固定滑窗题 2....,所以直接 r-l, 而不需要 +1 时间复杂度O(n), 这一次是值跑一次,l 基本靠跳 空间复杂度 (O(k)) k 是字符窗中不同字符集合值 var lengthOfLongestSubstring...长度最小子数组 分析 这里求是符合要求连续数组长度,所以这个长度是不确定,也就是窗口长度不确定; 这里求是一个窗口累加值 sum >= target, 一旦满足要求就要压缩窗口,得到最小符合要求连续数组长度...,然后将 l 指针跳转到最小变更下标,然后再次进行区域扩充 时间复杂度 O(n),n 是 nums 长度; 空间复杂度 O(k) var longestOnes = function (nums,...将 x 减到 0 最小操作数 分析 其实这道题截止条件可以转成,设置一个窗口,使得 total - sum === x ,其中 total 就是数组总和,sum 就是窗口里和;这样移除值就刚好等于

41340

前端刷完这12道滑动窗口,就可以出山面试了

无重复字符最长子串// 3. 无重复字符最长子串分析1. 这里求最长子串,证明有很多长度不一子串,那么就是有很多大小不一窗口,所以属于窗口不固定滑窗题2....+1时间复杂度O(n), 这一次是值跑一次,l 基本靠跳空间复杂度 (O(k)) k 是字符窗中不同字符集合值var lengthOfLongestSubstring = function(s) {...长度最小子数组分析这里求是符合要求连续数组长度,所以这个长度是不确定,也就是窗口长度不确定;这里求是一个窗口累加值 sum >= target, 一旦满足要求就要压缩窗口,得到最小符合要求连续数组长度...,然后将 l 指针跳转到最小变更下标,然后再次进行区域扩充时间复杂度 O(n),n 是 nums 长度; 空间复杂度 O(k)var longestOnes = function (nums, k...将 x 减到 0 最小操作数分析其实这道题截止条件可以转成,设置一个窗口,使得 total - sum === x ,其中 total 就是数组总和,sum 就是窗口里和;这样移除值就刚好等于

557160

LeetCode 1-5题 详解 Java版 (三万字 图文详解 LeetCode 算法题1-5 =====>>> <建议收藏>)

第一题:TWO SUM 1. 题目描述 (简单难度) 给定一个数组和一个目标和,从数组中找两个数字相加等于目标和,输出这两个数字下标。 2....这样只需判断 sub 在不在 hash key 里就可以了,而此时时间复杂度仅为 O(1)! 需要注意地方是,还需判断找到元素不是当前元素,因为题目里讲一个元素只能用一次。...题目描述(中等难度) 给定一个字符串,找到没有重复字符最长子串,返回它长度。 2....另一方面,如果字符串长度小于 m ,是 n 。那么 set 最长也就是 n 了。综上,空间复杂度为 O(min(m,n))。 3....左半部分长度比右半部分大 1 i + j = m - i + n - j + 1也就是 j = ( m + n + 1) / 2 - i 左半部分最大值小于等于右半部分最小值 max (

10010

LeetCode 周赛上分之旅 #49 再探内向基环树

固定 j : 为了让结果更大,应该找到 nums[j] 左边最大 nums[i] 和右边最大 nums[k] 组合,时间复杂度是 O(n^2) 。...我们也可以使用前后缀分解预处理出来,这样时间复杂度就是 O(n) ; 固定 k : 同理,固定 k 寻找应该找到左边使得 nums[i] - nums[j] 最大方案,这可以实现线性时间和常量空间...较大情况(大于等于数组整体和 s ):那么最小长度中一定包含整数倍 s ,以及某个 nums 子数组。...} } 复杂度分析: 时间复杂度: O(n) 最大扫描 2 倍数组长度; 空间复杂度:仅使用常量级别空间。...:找到基环长度 在拓扑排序后,树链上节点入度都是 0 ,因此入度大于 0 节点就位于基环上。

24820

JS算法_知识点精讲

O(n),空间复杂度为O(1) 示例:链表:1->2->3->3->2->1 该链表为回文链表 ❞ 分析 题目对时间复杂度和空间复杂度都有很高要求。...双层循序 通过对「极值」判断,对数据进行处理 由于采用了双层循环,所以该方法时间复杂度为O(n²),不够优雅。...是组合长度 index是当前取出数字 subset是当前子集 result是所有「已经生成」子集 当subset.length等于k时,进行子集收集处理 result.push([...subset...dp「前两个位置」 dp[0] = cost[0]; dp[1] = cost[1]; 用一个for循环根据状态转移方程逐一求解f(2)到f(n-1) 时间复杂度和空间复杂度都是O(n) ---- 空间复杂度为...有了这个长度O(n)数据,缓存之后就能够「确保每个子问题值需要计算一次」 时间复杂度为O(n) 第三种解法时间复杂度和空间复杂度都是O(n)。

2.1K10

10w字!前端知识体系+大厂面试总结(算法篇)

希望大家多多指正,一起交流学习,在此表示感谢 一道题解法,有很多种,对应时间复杂度与空间复杂度也各不相同,期待你答案,希望你可以在其中找到算法乐趣 算法 如何学习算法 1、先掌握对应数据结构...大顶堆:每个节点元素值不小于其子节点 小顶堆:每个节点元素值不大于其子节点 heap.png 堆作用 在庞大数据中,找到最大 m 个数或者最小 m 个数,可以借助堆来完成这个过程,时间复杂度为...nlogm 如果先排序,再取前 m 个数,最小时间复杂度nlogn nlogm < nlogn,堆排序时间复杂度更优 堆节点与其叶子节点规律 1)堆中父节点为k,它左子节点下标为2k+1,右子节点是...2k+2 2)所有序号大于length/2结点都是叶子节点, 0 到 length/2-1 为父节点 堆排序 从一堆数中,找到前 m 个最小值 如图,从下面的大顶堆中,找到前 4 个最小值,结果为[6...输入一个字符串,找到第一个不重复字符下标 输入abcabcde, 输出6, 第一个不重复字符为d // 方法一: // 先使用 Set 去重 // 然后两层遍历,时间复杂度为 O(n²) function

47610

10w字!前端知识体系+大厂面试总结(算法篇)

希望大家多多指正,一起交流学习,在此表示感谢 一道题解法,有很多种,对应时间复杂度与空间复杂度也各不相同,期待你答案,希望你可以在其中找到算法乐趣 算法 如何学习算法 1、先掌握对应数据结构...大顶堆:每个节点元素值不小于其子节点 小顶堆:每个节点元素值不大于其子节点 heap.png 堆作用 在庞大数据中,找到最大 m 个数或者最小 m 个数,可以借助堆来完成这个过程,时间复杂度为...nlogm 如果先排序,再取前 m 个数,最小时间复杂度nlogn nlogm < nlogn,堆排序时间复杂度更优 堆节点与其叶子节点规律 1)堆中父节点为k,它左子节点下标为2k+1,右子节点是...2k+2 2)所有序号大于length/2结点都是叶子节点, 0 到 length/2-1 为父节点 堆排序 从一堆数中,找到前 m 个最小值 如图,从下面的大顶堆中,找到前 4 个最小值,结果为[6...输入一个字符串,找到第一个不重复字符下标 输入abcabcde, 输出6, 第一个不重复字符为d // 方法一: // 先使用 Set 去重 // 然后两层遍历,时间复杂度为 O(n²) function

53310

​2021-03-30:给定一个整数组成无序数组arr,值可能正、可能负、可能0。

2021-03-30:给定一个整数组成无序数组arr,值可能正、可能负、可能0。给定一个整数值K找到arr所有子数组里,哪个子数组累加和<=K,并且是长度最大。返回其长度。...时间复杂度O(N*lgN)。无代码。 2.滑动窗口。时间复杂度O(N)。这道题用自然智慧想不到,需要练敏感度。有代码。 minSum数组,最小累加和,以i开头最小值。...minSumEnd数组,以i开头最小值,右边界在哪里。 采用滑动窗口,右指针每次移动多位,左指针每次移动一位。 虽然用到了两个for循环,但是右指针不回退,所以复杂度是O(N)。...// 1) 如果以i开头情况下,累加和<=k最长子数组是arr[i..end-1],看看这个子数组长度能不能更新res; // 2) 如果以i开头情况下,累加和<=k最长子数组比...= len(arr); i++ { sum += arr[i] pre = getLessIndex(h, sum-k) if pre !

44310

常见编程模式之滑动窗口

在以下场景中,我们可能会用到滑动窗口: 问题输入是一个「线性数据结构」,例如链表、数组或字符串 问题目标是找出「最长/最短」子串、子数组或是目标值 普通(暴力)解法时间复杂度相当高 经典例题 下面给出三道不同难度通过滑动窗口求解经典例题...我们可以考虑通过滑动窗口,持续跟踪窗口内和,以减小时间复杂度,如下图所示: ?...该方法对应 python 实现如下,时间复杂度为 : class Solution: def findMaxAverage(self, nums: List[int], k: int) -...这道题本质上即求「最多包含两种元素最长连续子序列」,可以通过滑动窗口法来求解,时间复杂度为 : class Solution: def totalFruit(self, tree: List...-「串联所有单词子串」(Hard) LeetCode 209-「长度最小子数组」(Medium) LeetCode 424-「替换后最长重复字符」(Medium) LeetCode 438-「找出字符串中所有字母异位词

2K20

LeetCode 周赛上分之旅 #38 结合排序不等式动态规划

因此,如果我们选择数字 x 为最终元素,那么决定替换秒数关键在与数组中不等于 x 最长子数组长度。...所以,我们算法是计算以每种数字 x 为目标的方案中,最短等于 x 最长子数组长度,并除以 2 向上取整到结果。...使数组和小于等于 x 最少时间(Hard) https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/ 题解(DP...二分答案(X): 数组元素和小于等于 x 与操作时间 t 不具备单调性,因此不能使用二分答案思路; 逆向思维: 令 s1 = sum(nums1), s2 = sum(nums2),假设经过 t 时间且不进行任何操作...动态规划(选哪个): 定义 dp[i][j] 表示到第 [i] 个元素为止操作 j 次时最大贡献度 目标:满足 dp[n][j] 小于等于 x 最小 j 值 状态转移方程(选和不选): dp[i][

22910
领券