
双指针
圆滚滚的柴柴
这个作者很懒,什么都没留下…
展开
-
牛客 剑指offer:删除有序链表中重复出现的元素
题目:删除有序链表中重复出现的元素思路:双指针。一个指针a负责串起来不重复的元素,一个指针b负责寻找不重复的元素。如果下一个节点的值与当前节点值相等,那么移动指针b到下一个不相等的节点;否则把当前节点串到a指针。代码:import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; * } */public class Solution { /**原创 2021-05-06 10:32:44 · 198 阅读 · 0 评论 -
leetcode Java:75. 颜色分类
题目:75. 颜色分类思路:双指针。一个指针指向0应该在的位置,一个指针指向2应该在的位置。遍历数组,把0交换到前面,把2交换到后面。代码:class Solution { public void sortColors(int[] nums) { int n = nums.length; int cur = 0, left = 0, right = n - 1; while (cur <= right) { if原创 2021-04-14 10:58:15 · 147 阅读 · 0 评论 -
牛客 剑指offer:两个链表的第一个公共节点
题目:两个链表的第一个公共节点思路:双指针。链表a、b的长度之和是一定的,两个指针分别指向两个链表头,同时后移,若移到链表尾就指向另一链表的表头。这样,二者必会相等。注意若没有相交,则二者同时到达对方链表尾部为空。代码:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solu原创 2021-03-23 16:03:29 · 85 阅读 · 0 评论 -
牛客 剑指offer:数组中相加和为0的三元组
题目:数组中相加和为0的三元组思路:三指针。数组排序;遍历数组,设当前位置为cur,用两个指针left、right分别指向cur的下一个位置和数组最后一个位置,判断这三个数之和与0的大小:如果三数之和等于0,那么加入结果集,left右移直到不重复的数,right左移直到不重复;如果三数之和小于0,left右移一步;如果三数之和大于0,right左移一步。重复上述过程。去重:若cur的值与cur-1的值相等,就跳过;找到解时,移动left与right时,遇见重复的值也跳过。代码:i原创 2021-03-20 10:10:10 · 291 阅读 · 0 评论 -
牛客 剑指offer:找到字符串的最长无重复字符子串
题目:找到字符串的最长无重复字符子串思路:滑动窗口。用两个指针记录滑动窗口的大小,用一个集合判断是否重复。如果没有重复就扩大窗口;有重复就记录此时最大长度,然后缩小窗口直到没有重复。重复以上过程。代码:集合实现import java.util.*;public class Solution { /** * * @param arr int整型一维数组 the array * @return int整型 */ public int max原创 2021-03-19 16:25:14 · 224 阅读 · 0 评论 -
leetcode Java:167. 两数之和 II - 输入有序数组
题目:167. 两数之和 II - 输入有序数组思路:双指针。一个指针在数组头,另一个指针在数组尾,根据指向的两数的和与target的大小更新指针。代码:class Solution { public int[] twoSum(int[] numbers, int target) { int[] res = new int[]{-1, -1}; int left = 0; int right = numbers.length - 1;原创 2021-03-17 16:07:34 · 82 阅读 · 0 评论 -
牛客 剑指offer:合并两个有序数组
题目:合并两个有序数组思路:三指针。把两个数组整合到其中一个数组A里,A有足够的空间可以容纳,因此可以借助未使用的那部分空间,从后往前整合两个数组。用三个指针,初始时,两个指向分别两个数组的最后一个元素,另一个cur指向A数组当前应该放数字的位置,即m+n-1;比较数组的两个元素,把大的数字挪到cur位置,相应指针前移。代码:public class Solution { public void merge(int A[], int m, int B[], int n) {原创 2021-03-16 15:50:26 · 196 阅读 · 0 评论 -
牛客 剑指offer:链表中环的入口节点
题目:链表中环的入口节点思路:不考虑空间,可以用一个集合来做。考虑空间:若有环,快慢指针必定会相遇。如下图:A是链表起始节点,B是环的入口,C是快慢指针相交的位置。相遇时:快指针走过:a + b + c + b;慢指针走过:a + b。由于快指针每次移动2步,因此,相遇时,快指针走的路程是慢指针的2倍。所以,有:a + b + c + b = 2 * (a + b),即a = c。相遇后,把slow指向head,slow和fast同步移动,再次相遇就是入口节点。代码:/** * De原创 2021-03-08 16:17:11 · 116 阅读 · 0 评论 -
leetcode Java:162. 寻找峰值
题目:162. 寻找峰值思路:题目有一点很重要:对于所有有效的 i 都有 nums[i] != nums[i + 1]。同时,峰值只要求大于相邻的数。线性查找:从头开始,只需要判断是否大于下一个数;如果不大于下一个数,那么我们会继续查找,也就是说,只要来到了当前位置,就已经保证了当前位置大于前一个位置。二分:找出中点mid,判断mid与mid+1处值的大小如果nums[mid] > nums[mid + 1]:说明峰值在左区间,我们更新右区间为mid;如果nums[mid] < n原创 2021-03-08 15:35:17 · 146 阅读 · 0 评论 -
leetcode Java:160. 相交链表
题目:160. 相交链表思路:双指针。对于两条链表a,b,a+b的节点数等于b+a的节点数。所以,我们用两个指针分别指向两个链表,遍历他们。如果a指针到了a链表最后一个节点,那么把a指针指向b链表;对b链表和b指针也是如此。如果两个链表有交点,那么上述遍历方式两个指针会同时到达起始交点;如果两个链表没有交点,那么当两个指针会同时到达对方的末节点。代码:/** * Definition for singly-linked list. * public class ListNode {原创 2021-03-06 14:38:15 · 102 阅读 · 0 评论 -
leetcode Java:154. 寻找旋转排序数组中的最小值 II
题目:154. 寻找旋转排序数组中的最小值 II思路:二分。与上一题不同的是,数组可以重复,那么旋转之后,可以以旋转点分成左右两个有序数组,且左侧数组中的元素一定大于等于右侧数组中的元素。二分时分为以下几种情况:nums[mid] > nums[right] :说明mid在左侧数组,此时移动left,left = mid + 1;nums[mid] < nums[right] :说明mid在右侧数组,此时移动right,注意,right = mid,因为存在mid即是最小值的情况;原创 2021-03-06 11:44:12 · 107 阅读 · 0 评论 -
leetcode Java:153. 寻找旋转排序数组中的最小值
题目:153. 寻找旋转排序数组中的最小值思路:二分。若一个数组被旋转,二分之后必有一段是有序的,并且最小的数一定在无序的那段。最小数的前一个数必定比它大。代码:class Solution { public int findMin(int[] nums) { if (nums.length == 1) { return nums[0]; } int left = 0; int right = nums原创 2021-03-05 18:20:47 · 120 阅读 · 0 评论 -
牛客 剑指offer:判断链表是否有环
题目:判断链表是否有环思路:双指针。快指针每次走2步,慢指针每次走一步。如果有环,二者必定相遇;如果没环,快指针必定率先到达链表尾部。代码:/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } *原创 2021-03-03 14:43:29 · 132 阅读 · 1 评论 -
leetcode Java二刷:35. 搜索插入位置
题目:35. 搜索插入位置思路:二分。二分的循环条件:while (left <= right)如果在mid处,找到了target,那么我们返回索引即可;如果数组不存在target,那我们需要返回插入target的索引:循环最后一步执行的必然是left == right,此时,有left == right == mid:如果mid小于target,left会右移跳出循环,我们要插入的位置是mid的后一位,刚好left是我们要插入的索引;如果mid大于target,那么right左移,l原创 2021-02-20 15:31:41 · 90 阅读 · 0 评论 -
leetcode Java二刷:34. 在排序数组中查找元素的第一个和最后一个位置
题目:34. 在排序数组中查找元素的第一个和最后一个位置思路:二分.分别查找最左边和最右边的索引。查找最左端的索引时,我们优先移动右指针。如果中点处找到target,那我们记录此时的位置,然后把右指针移到此处,接着再按照二分的思路更新左右指针。由于我们优先移动右指针,等于号这块归到右指针移动。查找最右端索引思路同上。代码:class Solution { public int[] searchRange(int[] nums, int target) {原创 2021-02-20 14:45:58 · 239 阅读 · 0 评论 -
leetcode Java二刷:33. 搜索旋转排序数组
题目:33. 搜索旋转排序数组思路:二分。查找有序数组我们一般都是二分,而题目将有序数组在某一个点翻转,那么我们需要在原来二分的算法加一点判断条件。 二分的思路是,每次找到中点,比较中点与目标值的大小来更新左右指针。 易知,有序数组翻转后,找到中点,分成两段,必有一段是有序的,这样,我们可以判断目标值是否在有序的区间内,进而更新左右指针,代码:class Solution { public int search(int[] nums, int target) {原创 2021-02-20 13:16:36 · 72 阅读 · 0 评论 -
leetcode Java二刷:28. 实现 strStr()
题目:28. 实现 strStr()思路:双指针。找到haystack字符串中与needle第一个字符相等的字符位置,然后两个指针分别指向该位置和needle的第一个字符,开始逐一比较。若相等则返回该位置。否则,从该位置的下一个位置开始,重复上述过程。代码:class Solution { public int strStr(String haystack, String needle) { int len = needle.length(); int原创 2021-02-18 16:41:59 · 66 阅读 · 0 评论 -
leetcode Java二刷:27. 移除元素
题目:27. 移除元素思路:双指针。跟上一题思路基本一致,一个指针cur指向可以写入的位置,另一个指针遍历元素,遇到与val相等的元素就跳过,不相等的写道cur的位置,cur后移。代码:class Solution { public int removeElement(int[] nums, int val) { if (nums.length == 0) { return 0; } int cur = 0;原创 2021-02-18 16:17:35 · 60 阅读 · 0 评论 -
leetcode Java二刷:26. 删除排序数组中的重复项
题目:26. 删除排序数组中的重复项思路:双指针。慢指针指向不重复的最后一个元素,快指针进行判重,如果重复,快指针继续移动;如果不重复慢指针移动一步,并把不重复的元素填充到慢指针的位置。代码:class Solution { public int removeDuplicates(int[] nums) { if (nums.length == 0) { return 0; } int low = 0;原创 2021-02-18 16:09:59 · 97 阅读 · 0 评论 -
leetcode Java二刷:18. 四数之和
题目:18. 四数之和思路:双指针在三数之和的外面加一层循环即可。代码:class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { Arrays.sort(nums); List<List<Integer>> res = new ArrayList<>(); for (int i = 0;原创 2021-01-11 19:09:34 · 64 阅读 · 0 评论 -
leetcode Java二刷:16. 最接近的三数之和
题目:16. 最接近的三数之和思路:双指针。与15题思路一致,修改判断结果条件即可。代码:class Solution { public int threeSumClosest(int[] nums, int target) { Arrays.sort(nums); int res = Integer.MAX_VALUE; int min = Integer.MAX_VALUE; for (int cur = 0; cur &原创 2021-01-11 17:52:30 · 63 阅读 · 0 评论 -
leetcode Java二刷:15. 三数之和
题目:15. 三数之和思路:双指针。首先对数组排序遍历数组,设当前位置为cur,用两个指针left,right分别指向cur的下一位、数组最后一位:如果三个指针的数字之和为0,则加入结果集,left指针右移,right指针左移,继续搜索;如果数字之和大于0,right指针左移,继续搜索;如果数字之和小于0,left指针右移,继续搜索。注意判重:如果当前数字与上一个数字相等,就跳过;更新left、right数组时,如果移动后与移动前值相等,那么就继续移动,直到遇见不重复的值。代码:原创 2021-01-11 17:49:20 · 95 阅读 · 0 评论 -
leetcode Java二刷:11. 盛最多水的容器
题目:11. 盛最多水的容器思路:双指针。左指针初始化为数组最左侧,右指针初始化为数组最右侧。计算左右指针包含的区间最大面积并更新结果,然后收缩其中高度较小的指针。代码:class Solution { public int maxArea(int[] height) { int left = 0; int right = height.length - 1; int maxarea = 0; while (left <原创 2021-01-06 15:58:47 · 75 阅读 · 0 评论