双指针/滑动窗口
双指针或者滑动窗口的一些题目
追光者2020
没有实力的愤怒毫无意义。
展开
-
LeetCode 611. 有效三角形的个数(双指针)
题目描述给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。示例 1:输入: [2,2,3,4]输出: 3解释:有效的组合是:2,3,4 (使用第一个 2)2,3,4 (使用第二个 2)2,2,3注意:数组长度不超过1000。数组里整数的范围为 [0, 1000]。需要确定三个数字,首先确定其中两个,然后再判断剩余的那个,首先确定 i , j ,其中i > j,然后要在小于 j 的部分确定 k,构成的是三角形,那么任意两边之和大于第三边,也就是1)原创 2021-08-23 10:25:09 · 145 阅读 · 0 评论 -
leetcode 18. 四数之和(双指针)
题目描述给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] :0 <= a, b, c, d < n。a、b、c 和 d 互不相同。nums[a] + nums[b] + nums[c] + nums[d] == target你可以按 任意顺序 返回答案 。示例 1:输入:nums = [1,0,-1,0,-2,2], target = 0输出原创 2021-08-13 09:27:33 · 94 阅读 · 0 评论 -
leetcode 567. 字符串的排列 and leetcode 438 找到字符串中所有字母异位词(滑动窗口)
题目描述给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。换句话说,s1 的排列之一是 s2 的 子串 。示例 1:输入:s1 = “ab” s2 = “eidbaooo”输出:true解释:s2 包含 s1 的排列之一 (“ba”).示例 2:输入:s1= “ab” s2 = “eidboaoo”输出:false题目要求s2中是否包含s1的排列,则子串的长度与s1的长度是相等的,定义两个hash来保存s1中出现单词的次数,保存cnt2中出现的子串中每个单词原创 2021-08-12 17:05:09 · 79 阅读 · 0 评论 -
LeetCode 167. 两数之和 II - 输入有序数组(二分/双指针)
题目描述给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例 1:输入:numbers = [2,7,11,15], target原创 2021-08-10 19:10:14 · 58 阅读 · 0 评论 -
209. 长度最小的子数组(滑动窗口)
题目描述给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例 1:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。示例 2:输入:target = 4, nums = [1,4,4]输出:1示例 3:原创 2021-08-07 11:34:45 · 82 阅读 · 0 评论 -
LeetCode 392. 判断子序列(双指针)
题目描述给定字符串 s 和 t ,判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。进阶:如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?示例 1:输入:s = “abc”, t = “ahbgdc”输出:true示例 2:输入:s原创 2021-06-20 16:52:20 · 121 阅读 · 0 评论 -
递增的三元子序列(双指针)
题目描述给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。示例 1:输入:nums = [1,2,3,4,5]输出:true解释:任何 i < j < k 的三元组都满足题意示例 2:输入:nums = [5,4,3,2,1]输出:false解原创 2021-06-10 10:27:18 · 94 阅读 · 0 评论 -
LeetCode 283 移动零(双指针)
题目描述给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。i :表示在i 之前已经处理过的数列的结尾位置j :表示在即将处理的数列的头位置j 不断向右移动指向非零数字。不管怎么,j 一直向右移动,i 是在nums[j] 是非零数字的情况下向右移动,即表示当前已经处理过的序列的长度,也可以在运行过程中指向零元素,注原创 2021-06-10 09:36:19 · 71 阅读 · 0 评论 -
面试题 10.01 合并两个有序数组(双指针)
题目描述给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]示例 2:输入:nums1 = [1],原创 2021-06-03 19:29:14 · 199 阅读 · 0 评论 -
LeetCode344 反转字符串(双指针)
题目描述编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例 1:输入:[“h”,“e”,“l”,“l”,“o”]输出:[“o”,“l”,“l”,“e”,“h”]示例 2:输入:[“H”,“a”,“n”,“n”,“a”,“h”]输出:[“h”,“a”,“n”,“n”,“a”,“H”]反转字原创 2021-06-03 11:20:36 · 123 阅读 · 0 评论 -
LeetCode 11. 盛最多水的容器(双指针)
题目描述给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。题解:想到双指针不容易原创 2021-06-03 10:55:20 · 96 阅读 · 0 评论 -
LeetCode 16 最接近的三数之和(指针)
题目描述给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。示例:输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。题解:双指针,首先将数组排序,其次确定指针位置。外层循环确定第一个位置的指针,第二个指针 j 的起始位置在第一个指针的下一个位置,第三个指针 k 在原创 2021-06-03 09:31:06 · 52 阅读 · 0 评论 -
LeetCode 15 三数之和(指针)
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]三个数,两重循环,第一重循环负责遍历first指针,且与上一次遍历的first值不相等。原创 2021-06-02 11:42:42 · 63 阅读 · 0 评论 -
链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第 k 个结点。注意:k >= 1;如果 k 大于链表长度,则返回 NULL;样例输入:链表:1->2->3->4->5 ,k=2输出:4使用快慢指针,快指针先走k步,然后慢指针与快指针一起走,直到快指针走到链表结尾,此时慢指针指向的位置为倒数k个节点。一些特殊情况,如果链表为空,那么返回nullptr,如果k的值大于链表的长度返回也是nullptr/** * Definition for singly-linked l原创 2021-05-27 20:21:36 · 76 阅读 · 0 评论 -
数组去重(双指针)
题目描述给定一个长度为 n 的数组 a,请你编写一个函数:int get_unique_count(int a[], int n); // 返回数组前n个数中的不同数的个数输入格式第一行包含一个整数 n。第二行包含 n 个整数,表示数组 a。输出格式共一行,包含一个整数表示数组中不同数的个数。数据范围1≤n≤1000输入样例:51 1 2 4 5输出样例:4解法:双指针做法:使用指针k 和 i,指针i 不断向后移动,如果指针 i 所指向的值与指针k-1 所指向的值原创 2021-05-27 08:44:24 · 952 阅读 · 0 评论 -
800. 数组元素的目标和(双指针)
题目描述给定两个升序排序的有序数组 A 和 B,以及一个目标值 x。数组下标从 0 开始。请你求出满足 A[i]+B[j]=x 的数对 (i,j)。数据保证有唯一解。输入格式第一行包含三个整数 n,m,x,分别表示 A 的长度,B 的长度以及目标值 x。第二行包含 n 个整数,表示数组 A。第三行包含 m 个整数,表示数组 B。输出格式共一行,包含两个整数 i 和 j。数据范围:数组长度不超过 105。同一数组内元素各不相同。1≤数组元素≤109示例1:输入样例:4 5 6原创 2021-05-26 21:46:20 · 152 阅读 · 0 评论 -
day35:77. 翻转单词顺序(微软面试)(双指针)
问题描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。样例输入:“I am a student.”输出:“student. a am I”常规的想法是建立另一个数组,直接操作两个数组,这样的话会引入额外的空间,另一个思路是使用栈,在这里使用的是分步骤的方法,直接翻转字符串会将所有的单词翻转,那么现在我们遇到空格,将空格前的单词翻转即可,这样一原创 2020-06-30 10:30:28 · 3320 阅读 · 0 评论 -
字符流中第一个只出现一次的字符(单调队列,双指针)
问题描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是’g’。当从该字符流中读出前六个字符”google”时,第一个只出现一次的字符是’l’。如果当前字符流没有存在出现一次的字符,返回#字符。样例输入:“google”输出:“ggg#ll”解释:每当字符流读入一个字符,就进行一次判断并输出当前的第一个只出现一次的字符。巧妙地使用了队列,遇到第一个字母加入队列,下一个字母与队列的队首元素比较,如果相等,那么该队列队首原创 2020-07-11 19:44:54 · 193 阅读 · 0 评论 -
链表中环的入口结点(双指针)
题目描述给定一个链表,若其中包含环,则输出环的入口节点。若其中不包含环,则输出null。样例给定如上所示的链表:[1, 2, 3, 4, 5, 6]2注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。则输出环的入口节点3.使用双指针,解法是定义一个慢指针first以及一个快指针second,慢指针走一步,快指针走两步,如果快指针都到了nullptr,则说明没有环,否则二者相遇之后,慢指针回到头结点,快指针不变,之后二者同时移动直到相遇,此时返回节点原创 2021-05-26 20:23:48 · 100 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一。解题思路:双指针定义头尾指针,其中头指针一直向右移动,直到指的是偶数停止移动,尾指针一直向左移动,直到指的是奇数停止移动,此时如果 i 满足小于 j 就需要将 i 指向的偶数交换到 j 指向的奇数的位置,可以理解为将 j 指向的奇数交换到数组的前面。原创 2021-04-21 20:35:06 · 73 阅读 · 0 评论 -
day34:和为S的连续正数序列(双指针)
问题描述:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。样例:输入:15输出:[[1,2,3,4,5],[4,5,6],[7,8]]运用双指针,前提是序列是有序的,设置两个指针 i 和 j, i 向前移动,求和过程是在 i 和 j 之间求和,如果不满足给定的目标值,那么 j 也要向前移动,j 移动的过程在求和的过程中,由于可能涉及多个连续序列和为目标值,因此使用原创 2020-06-29 09:53:17 · 4030 阅读 · 0 评论 -
day10:61. 最长不含重复字符的子字符串(双指针)
问题描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从’a’到’z’的字符。样例输入:“abcabc”输出:3使用双指针,i 和 j 是两个指针,使用双指针的时候需要注意的是,指针移动的方向是同向的,不可能出现一个指针向后一个指针向前类似这种情况,首先 i 不动,j 向后移动,当数组里面出现了出现次数为2的序列,那么移动 i ,直到数组中出现次数全部为1,将每次的区间长度 j-i+1与上一次区间长度 res 作比较取其中最大的值返回。cl原创 2020-06-24 10:33:14 · 129 阅读 · 0 评论 -
最大的和(双指针,前缀和)
题目描述给定一个长度为 n 的正整数数列 a1,a2,…,an。初始时,数列中的每个元素要么处于可选状态,要么处于不可选状态。你可以选择一个长度恰好为 k 的区间 [i,i+k−1],使得 ai∼ai+k−1 这 k 个元素的状态全部变为可选。请问,在经过此操作后,所有处于可选状态的元素之和最大是多少。输入格式第一行包含两个整数 n 和 k。第二行包含 n 个整数 ai。第三行包含一个长度为 n 的 01 序列,如果第 i 个数为 1,表示 ai 的初始状态为可选,如果第 i 个数为 0,表示原创 2021-05-26 09:23:43 · 260 阅读 · 0 评论 -
最小覆盖子串(滑动窗口)
题目描述给出两个字符串 SS 和 TT,要求在O(n)O(n)的时间复杂度内在 SS 中找出最短的包含 TT 中所有字符的子串。例如:S ="XDOYEZODEYXNZ"S=“XDOYEZODEYXNZ”T =“XYZ"T=“XYZ”找出的最短子串为"YXNZ”“YXNZ”.注意:如果 S 中没有包含 T 中所有字符的子串,返回空字符串 “”;满足条件的子串可能有很多,但是题目保证满足条件的最短的子串唯一。示例1输入 “XDOYEZODEYXNZ”,“XYZ”返回值 “YXNZ”题原创 2021-05-09 11:43:50 · 146 阅读 · 0 评论