双指针法
leetCode涉及双指针法的题目
消灭猕猴桃
保持热爱,奔赴山海
展开
-
[leetCode]42. 接雨水
动态规化使用两个数组保存左边数字的最大值与右边数字的最大值遍历数组中每个元素,该元素所在位置能接的雨水量为该元素左边界和右边界的最小值减去该位置柱子的高度class Solution { public int trap(int[] height) { if (height == null || height.length < 3) return 0; int ans = 0; int[] leftMaxArr .原创 2020-10-01 11:26:42 · 115 阅读 · 0 评论 -
[leetCode]228. 汇总区间
题目https://leetcode-cn.com/problems/summary-ranges/solution/hui-zong-qu-jian-by-leetcode-solution-6zrs/双指针需要注意溢出的情况,因此不能做减法判断相邻数的增量是否为1class Solution { public List<String> summaryRanges(int[] nums) { int n = nums.length; Lis原创 2021-01-10 09:41:53 · 76 阅读 · 0 评论 -
[leetCode]189. 旋转数组
题目https://leetcode-cn.com/problems/rotate-array/数组翻转数组元素向右移动k次后,数组最后的k mod n个元素会移到数组前部例如 [1,2,3,4,5,6,7] , k = 3先将整个数组翻转得到[7,6,5,4,3,2,1]再将[0,k-1]个元素翻转[5,6,7,4,3,2,1]再将[k, n - 1]个元素翻转[5,6,7,1,2,3,4]class Solution { public void rotate(int[原创 2021-01-08 09:50:25 · 58 阅读 · 0 评论 -
[leetCode]830. 较大分组的位置
题目https://leetcode-cn.com/problems/positions-of-large-groups/一次遍历使用一个变量num记录当前分组的长度num初始值为1,如果当前字符与之前的字符不同或者当前遍历到了数组尾部则判断num的大小如果num >= 3,则加入答案,其他情况使num++.class Solution { public List<List<Integer>> largeGroupPositions(String s) {原创 2021-01-05 08:35:04 · 108 阅读 · 3 评论 -
[leetCode]3. 无重复字符的最长子串
题目https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/滑动窗口维护左右两个指针,动态控制窗口大小,right指针控制窗口扩大,left指针控制窗口缩小,要注意区间为[left, right) ,左闭右开。一开始右指针向右移动,使用Map维护当前元素最后出现位置的下标,如果Map中不存在当前字符则更新Map与字符串长度curLen。右指针在向右移动过程中如果遇到了Map中已经存在的字符原创 2020-12-23 13:25:01 · 88 阅读 · 0 评论 -
[leetCode]438. 找到字符串中所有字母异位词
题目https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/滑动窗口此题与 【567.字符串排列】解法一样。class Solution { private List<Integer> res = new ArrayList<>(); public List<Integer> findAnagrams(String s, String p) { int le原创 2020-12-22 21:30:41 · 102 阅读 · 0 评论 -
[leetCode]76. 最小覆盖子串
题目https://leetcode-cn.com/problems/minimum-window-substring/滑动窗口定义左右指针控制窗口内元素增减,也就是控制了窗口向右移动。首先,右指针向右移动知道窗口内的字符串包含了t中的所有字符。然后控制左指针向右移动缩小窗口,直到窗口内元素不包含t中所有字符,在移动左指针更新最小长度。判断窗口内元素是否包含t中所有字符可以使用一个变量valid如果窗口内右指针指向元素的个数小于t中该元素的个数则valid++,如果窗口内的字符串包含了t中所有元原创 2020-12-22 12:57:43 · 78 阅读 · 0 评论 -
[leetCode]移动零
题目https://leetcode-cn.com/problems/move-zeroes/给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。双指针思路:定义一个left指针指向已经处理的尾部,再定义一个right指针指向未处理序列的头部,如果right指针遇到非0元素则交换left与right指向元原创 2020-11-19 09:40:15 · 127 阅读 · 0 评论 -
[leetCode]328. 奇偶链表
题目链接:https://leetcode-cn.com/problems/odd-even-linked-list给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。双指针思路: 使用一个odd指针指向链表中的奇数位置的节点,pre指针为odd的前一个节点。通过操作pre与odd指针来删原创 2020-11-13 09:03:47 · 87 阅读 · 0 评论 -
[leetCode]922. 按奇偶排序数组 II
题目链接:https://leetcode-cn.com/problems/sort-array-by-parity-ii给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。你可以返回任何满足上述条件的数组作为答案。示例:输入:[4,2,5,7]输出:[4,5,2,7]解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。 提示:2 <原创 2020-11-12 09:07:17 · 149 阅读 · 2 评论 -
[leetCode]524. 通过删除字母匹配到字典里最长单词
题目链接:https://leetcode-cn.com/problems/longest-word-in-dictionary-through-deleting给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。示例 1:输入:s = "abpcplea", d = ["ale","apple","monkey","plea"]输出: "appl原创 2020-11-08 17:25:17 · 120 阅读 · 0 评论 -
[leetCode]680. 验证回文字符串 Ⅱ
题目链接:https://leetcode-cn.com/problems/valid-palindrome-ii给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。示例 1:输入: "aba"输出: True示例 2:输入: "abca"输出: True解释: 你可以删除c字符。注意:字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。双指针使用双指针一个从左向右遍历,一个从右向左遍历,判断两个指针所指向的字符是否相等,如果不等则判断删除原创 2020-11-08 16:02:45 · 118 阅读 · 0 评论 -
[leetCode]345. 反转字符串中的元音字母
题目链接:https://leetcode-cn.com/problems/reverse-vowels-of-a-string编写一个函数,以字符串作为输入,反转该字符串中的元音字母。示例 1:输入:"hello"输出:"holle"示例 2:输入:"leetcode"输出:"leotcede" 提示:元音字母不包含字母 "y" 。双指针使用双指针,一个从前向后遍历一个从后向前遍历,如果两个指针指向的值都为元音字母则交换两个字符。可以通过HashSet快速判断字符是原创 2020-11-08 15:49:26 · 109 阅读 · 0 评论 -
[leetCode]167. 两数之和 II - 输入有序数组
题目链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = [2原创 2020-11-08 15:27:05 · 117 阅读 · 0 评论 -
[leetCode]11. 盛最多水的容器
题目链接:https://leetcode-cn.com/problems/container-with-most-water给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。输入:[1,8,6,2,5,4,8,3,7]输出:49 解释:图中垂直线代表输入数组 [1,8,6原创 2020-11-07 21:34:56 · 90 阅读 · 0 评论 -
[leetCode]27.移除元素
解法一 暴力法定义一个指针i指向nums第一位,向后遍历,如果遇到nums[i]=val则将nums[i]之后的元素整体向前移动一位class Solution { public int removeElement(int[] nums, int val) { int len = nums.length; int i = 0;//定义一个i指针指向数组第一位 for(; i < len;){ if(nums[i] =.原创 2020-06-21 09:56:52 · 119 阅读 · 0 评论 -
[leetCode]26. 删除排序数组中的重复项
解法 双指针法i为慢指针,j为快指针,一开始i指向第一个数组元素,j指向第2个数组元素,如果i与j指向的元素相等就移动j指针跳过相同元素,如果跳过重复元素结束(nums[j]!=nums[i])就令i+1指向的元素等于j指向的元素。最后返回数组的长度i+1。class Solution { public int removeDuplicates(int[] nums) { int i = 0;//慢指针 //j为快指针,用于跳过重复项 for(i.原创 2020-06-20 13:05:06 · 140 阅读 · 0 评论 -
[leetCode]38. 外观数列
解法一 递归+双指针f(1)=1f(1) = 1f(1)=1f(2)=11f(2) = \bm11f(2)=11f(3)=21f(3) = \bm21f(3)=21f(4)=1211f(4) = \bm12\bm11f(4)=1211…通过观察可以知道要知道f(n)则需要知道f(n-1)…f(1),因此可以想到递归;通过观察可知,每个外观字符串都是由前一个字符串的每一个字符"计数值"(加粗字符)加上所计数的字符,因此可以使用双指针法对相同字符计数并完成字符串拼接。class Solution.原创 2020-06-24 10:11:14 · 155 阅读 · 0 评论 -
[leetCode]88.合并两个有序数组
解法一 插入排序思路:因为两个数组是有序的,因此可以在nums1尾部插入一个元素,再对左半部分进行扫描将插入的元素放在合适位置。class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { for(int i = m; i < m+n; i++) { nums1[i] = nums2[i-m]; for(int j = i; j >原创 2020-07-03 11:01:56 · 407 阅读 · 0 评论 -
[leetCode]剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
双指针lo指针指向数组前,hi指针指向数组尾部,lo指针向后移动直至指向的元素为偶数,hi指针向前移动直至指向的元素为奇数,然后交换两个指针所指元数的位置。class Solution { public int[] exchange(int[] nums) { int lo = 0, hi = nums.length - 1; while(hi > lo){ //向后移动指针lo直到遇到一个偶数 while(.原创 2020-08-17 13:44:37 · 115 阅读 · 0 评论 -
[leetCode]剑指 Offer 57. 和为s的两个数字、II. 和为s的连续正数序列
解法 双指针由于数组是递增排序的所以可以设置两个指针,一个指向头部,一个指向尾部。两指针所指元素相加,若大于目标值则跳转尾部指针向前移动。若小于目标值则调整头部指针向后移动。class Solution { public int[] twoSum(int[] nums, int target) { if (nums == null || nums.length == 0) return new int[]{}; // 向前移动的指针 .原创 2020-09-21 09:45:20 · 71 阅读 · 0 评论 -
[leetCode]剑指 Offer 63. 股票的最大利润
解法使用一个变量min保存数组前i-1个元素的最小值,扫描整个数组更新最小值的同时计算差值,通过打擂的方式获得最大利润。class Solution { public int maxProfit(int[] prices) { if (prices == null || prices.length < 2) return 0; int min = prices[0]; int maxDiff = prices[1] - min; .原创 2020-09-27 07:41:54 · 69 阅读 · 0 评论 -
[leetCode]15. 三数之和
排序 + 双指针思路: 先将数组排序,再从数组中取出一个元素。使用两个指针从该元素之后取出一小一大两个元素,如果当前三个元素相加不为0,那么调整两个指针的位置继续求和。如果为0则将三个元素加入结果中。class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); List<List<Integer>> ans.原创 2020-10-04 16:02:23 · 74 阅读 · 0 评论 -
[leetCode]977. 有序数组的平方
解法 双指针定义两个指针指向数组前后,比较指向元素的平方大小,从答案数组之后向前填充class Solution { public int[] sortedSquares(int[] A) { if (A == null) return null; int n = A.length; int[] ans = new int[n]; int i = 0, j = n - 1, p = n-1; while (i &l.原创 2020-10-16 09:45:45 · 163 阅读 · 0 评论 -
[leetCode]925. 长按键入
双指针typed中的字符有两种情况:name中的一部分,匹配那么中的一个字符长按键入的一部分,它应与前一个键入的字符相同如果typed中的字符两个条件均未满足则返回false,否则当typed扫描完毕后检查name中每个字符是否匹配完毕。使用两个下标 i, j追踪name,typedname[i] == typed[j] : i,j都自增1如果typed[j] == typed[j-1] 则j自增1最后如果i==name.length() 则代表name每个字符都被匹配了clas.原创 2020-10-21 10:34:58 · 116 阅读 · 0 评论 -
[leetCode]763. 划分字母区间
贪心算法+双指针class Solution { public List<Integer> partitionLabels(String S) { // 字符串S中每个字母最后出现的下标 int[] last = new int[26]; int length = S.length(); for (int i = 0; i < length; i++) { last[S.charAt(i) .原创 2020-10-22 08:38:03 · 98 阅读 · 0 评论 -
[leetCode]845. 数组中的最长山脉
博客园:原题地址:https://leetcode-cn.com/problems/longest-mountain-in-array我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:B.length >= 3存在 0 < i < B.length - 1 使得 B[0] < B[1] < … B[i-1] < B[i] > B[i+1] > … > B[B.length - 1](注意:B 可以是 A 的任意子数组,包括.原创 2020-10-25 10:14:11 · 103 阅读 · 0 评论 -
[leetCode]454. 四数相加 II
博客园:题目给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 −228到228−1-2^{28} 到 2^{28} - 1−228到228−1 之间,最终结果不会超过 231−12^{31} - 1231−1 。例如:输入:A = [ 1, 2]B = [.原创 2020-10-27 13:46:33 · 252 阅读 · 0 评论 -
[leetCode]18. 四数之和
博客园:题目链接: https://leetcode-cn.com/problems/4sum/给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。示例:给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。满足要求的四元组集合为:[ .原创 2020-10-27 18:40:13 · 109 阅读 · 0 评论