
双指针
Betternw
这个作者很懒,什么都没留下…
展开
-
1143 最长公共子序列 最长公共前缀
题目描述给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。示例 1:输入:text1 = “abcde”, text2 =原创 2021-07-21 09:56:26 · 160 阅读 · 0 评论 -
206反转链表、奇偶重排、重排链表
题目反转一个单链表分析动画演示指针逆序实际上需要两个指针,原本的后指向原本的前,但是在每一次指向的时候都需要一个指针保存第三个。否则无法移动。代码原创 2020-06-02 20:41:16 · 278 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)分析两个指针分别遍历。让a+b作为链表A的新长度,b+a作为链表B的新长度。代码class Solution {public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { ListNode *ta = pHead1, *tb = pHe原创 2021-08-01 15:34:08 · 109 阅读 · 0 评论 -
大数相加(字符串)
题目描述以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。(字符串长度不大于100000,保证字符串仅由’0’~'9’这10种字符组成)示例1输入:“1”,“99”返回值:“100”说明:1+99=100分析从尾部相加代码 public String solve(String s, String t) { StringBuilder stringBuilder = new StringBuilder(); int i =原创 2021-08-01 15:07:32 · 407 阅读 · 0 评论 -
最长无重复子数组 最长连续子序列
题目给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组示例1输入:[2,3,4,5] 返回值:4说明:[2,3,4,5]是最长子数组示例2输入:[2,2,3,4,3] 返回值:3说明:[2,3,4]是最长子数组分析使用哈希表。我们使用两个指针,一个i一个j,最开始的时候i和j指向第一个元素,然后i往后移,把扫描过的元素都放到原创 2021-08-01 14:40:37 · 1081 阅读 · 0 评论 -
92 反转链表2
题目描述给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。示例 1:输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]示例 2:输入:head = [5], left = 1, right = 1输出:[5]分析两个指针遍历到中间部分,将中间部分反转,再进行连接。代码 public L原创 2021-07-22 09:59:14 · 93 阅读 · 0 评论 -
151 翻转字符串里的单词
题目描述给你一个字符串 s ,逐个翻转字符串中的所有 单词 。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。说明:输入字符串 s 可以在前面、后面或者单词间包含多余的空格。翻转后单词间应当仅用一个空格分隔。翻转后的字符串中不应包含额外的空格。示例 1:输入:s = “the sky is blue”输出:“blue is sky the”分析去掉首尾空格当前单词不为空时,连接到word原创 2021-07-07 10:34:33 · 73 阅读 · 0 评论 -
415 字符串相加
题目描述给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。提示:num1 和num2 的长度都小于 5100num1 和num2 都只包含数字 0-9num1 和num2 都不包含任何前导零你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式分析carry保存进位代码 public String addStrings(String num1, String num2) { StringBuilder res = new原创 2021-07-05 17:13:51 · 72 阅读 · 0 评论 -
【滑动窗口】 串联所有单词的子串
题目描述:给定一个字符串 s 和一些 长度相同 的单词 words 。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。示例 1:输入:s = “barfoothefoobarman”, words = [“foo”,“bar”]输出:[0,9]解释:从索引 0 和 9 开始的子串分别是 “barfoo” 和 “foobar” 。输出的顺序不重要, [9,0]原创 2021-05-24 22:13:52 · 219 阅读 · 0 评论 -
27 移除元素
题目描述给定一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,返回移除后数组的新长度。需要原地修改输入数组。思路分析【双指针】和26类似,定义两个指针,但是因为存在可能第一个数字就是val的情况,因此 j 指针从0开始遍历。当不等于val时,向后加一。注意这个的点是:i当前所指向的,被覆盖掉。而26是,i指向的下一个,被覆盖掉,因为重复元素需要留一个。所以这两段代码在先...原创 2020-02-19 22:44:38 · 88 阅读 · 0 评论 -
88 合并两个有序数组
题目描述给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组。初始化num1和nums2的元素数量分别为m和n。假设nums1有足够的空间来保存nums2中的元素...原创 2020-03-08 16:36:40 · 141 阅读 · 0 评论 -
125 验证回文串
题目描述给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。示例 1:输入: “A man, a plan, a canal: Panama” 输出: true示例 2: 输入: "race a car“ 输出: false思路分析首先分析清楚题目,只考虑字母和数字字符。那么遇到不是这两个的就跳过去。双指针,一前一后,当不是字母和数字时跳过,当是时,进行...原创 2020-03-09 11:11:17 · 140 阅读 · 0 评论 -
167 两数之和
题目描述给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。示例:输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2]思路分析双指针,一前一后,如果小于或者大于目标值,单个指针移动。等于就返回。代码实现...原创 2020-03-09 18:43:45 · 202 阅读 · 0 评论 -
【双指针 动态规划dp数组】5 最长回文子串
题目给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。思路暴力法定义一个判定回文的方法。双指针移动,当i-j之间的子串满足回文且本次的长度大于上次的长度,更新最大长度值,并用一个指针记录当前的i也就是字符串的开头位置。代码public String longestPalindrome(String s) { int len = s.length(); int原创 2020-06-11 16:28:49 · 159 阅读 · 0 评论 -
【双指针追击问题】 offer22 链表中的倒数第K个节点
题目输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。代码 public ListNode getKthFromEnd(ListNode head, int k) { ListNode left = head; ListNode right = head; //right原创 2020-07-05 20:16:58 · 152 阅读 · 0 评论 -
【双指针 相遇问题】 offer57和为s的两个数字/和为目标值的多个数字
题目输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例 1:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]示例 2:输入:nums = [10,26,30,31,47,60], target = 40输出:[10,30] 或者 [30,10]思路相遇类型的双指针代码 public int[] twoSum(int[] nums, int target) {原创 2020-07-12 18:06:18 · 139 阅读 · 0 评论 -
【双指针】 offer 57-2 和为s的连续正数序列
题目输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]思路集合转成数组的两种方法Object[] obj = arr.toArray();//第一种方法// int [][]cures = new int原创 2020-07-12 18:46:56 · 132 阅读 · 0 评论 -
【双指针】 offer 21 调整数组顺序使奇数位于偶数前面
题目难度简单26输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。思路设置双指针,分别位于头和尾。头指针遇到奇数继续前进,遇到偶数停尾指针遇到偶数继续前进,遇到奇数停然后交换位置代码public int[] exchange(int[] nums) { int left = 0; int right = nums.length-1; while(left<right){ //注意在原创 2020-07-02 15:22:19 · 142 阅读 · 0 评论 -
【双指针】 offer58-1 翻转单词顺序
题目输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例 1:输入: “the sky is blue”输出: “blue is sky the”示例 2:输入: " hello world! "输出: “world! hello”解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入: “a go原创 2020-07-12 19:11:22 · 137 阅读 · 0 评论 -
offer 18 删除链表的节点
题目给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。输入: head = [4,5,1,9], val = 5输出: [4,1,9]思路双指针遍历代码public ListNode deleteNode(ListNode head, int val) { if(head.val==val) return head.next; ListNode cur = head; ListNode bef = cur.next; while(bef!=nu原创 2020-07-05 19:12:52 · 91 阅读 · 0 评论 -
offer66 构建乘积数组
题目给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B 中的元素 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。示例:输入: [1,2,3,4,5]输出: [120,60,40,30,24]思路建立两个数组,分别维护当前数字左边和右边的乘积。代码 public int[] constructArr(int[] a) { if(a==null||a.length==0) return n原创 2020-07-14 14:49:10 · 110 阅读 · 0 评论 -
【双指针】 581最短无序连续子数组
题目给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。你找到的子数组应是最短的,请输出它的长度。输入: [2, 6, 4, 8, 10, 9, 15]输出: 5解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。思路从前遍历,设置max值并更新,找到第一个小于max值的数字就是左边界。从后遍历,设置min值并更新,找到第一个大于min的值的数字就是右边界。代码public int find原创 2020-06-21 17:55:17 · 119 阅读 · 0 评论 -
【前缀和】560 和为k的子数组
题目给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。分析暴力优化:固定左边界,移动右边界代码实现分析【j…i】子数组和为k等价于pre[i]−pre[j−1]==k。即pre[j−1]==pre[i]−k...原创 2020-05-27 23:58:27 · 453 阅读 · 0 评论 -
【快速排序 双指针】 283 移动零
题目给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。输入: [0,1,0,3,12]输出: [1,3,12,0,0]分析数字根据大小进行区域的划分——想到快速排序。双指针,j指向不等于0的区域,i进行遍历,遇到不等于0的就交换到j的区域中。最后左边都是不等于0的数字。右边是0。代码public void moveZeroes(int[] nums) { if(nums==null){ return; } i原创 2020-06-10 12:38:34 · 159 阅读 · 0 评论 -
【快慢指针/栈】234 回文链表
题目描述判断一个链表是否为回文链表分析使用空间为n:将链表整个压入栈。然后栈元素弹出。挨个比较元素是否相同。使用空间为n/2:快慢指针。快指针一次两步慢指针一次一步。快指针到达结尾时,慢指针到达中间,中间部分之后压入栈。然后栈弹出元素,与前半部分相比较。不使用额外空间:快慢指针。快指针一次两步慢指针一次一步。快指针到达结尾时,慢指针到达中间。然后将后半部分链表逆序。两个指针分别从头尾出发,进行元素比较。最后要将后半部分再还原回来。代码...原创 2020-05-29 21:14:21 · 174 阅读 · 0 评论 -
【双指针,】160 相交链表
题目描述编写一个程序找到两个单链表相交的起始节点分析求出两个链表的长度。当尾指针不相等时必不相交。让长链表指针先走一段长度之差,然后两个链表指针一起走,当相等时即为相交指针。当两个节点相等时,值和next指针一定都是相等的。所以不会存在123456和123546这种情况。代码...原创 2020-06-02 18:00:56 · 127 阅读 · 0 评论 -
【快慢指针,分治合并 归并排序,合并链表】148 排序链表
题目在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。分析归并排序+合并链表的思路首先使用快慢指针+递归将链表拆为多个子链表,然后使用合并链表的思路将每个子链表两两排序连接起来。最后返回链表头代码public class ListNode{ int val; ListNode next; public ListNode(int data) { this.val = data; }}public ListNode so原创 2020-06-02 23:39:20 · 157 阅读 · 0 评论 -
【快慢指针 先判断是否有环 然后寻找入环点】 142 环形链表
题目给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。分析快慢指针,快指针一次两步慢指针一次一步。当快指针走到空时证明无环。如果有环,快慢指针必相遇。相遇后快指针回到起点,和慢指针一起走,再次相遇时为入口。环外链表的长度 = 第一次相遇点 + n-1次环的长度(公式推导)代码public class ListNode{ int val; ListNode next; public ListNode(int dat原创 2020-06-03 23:24:29 · 174 阅读 · 0 评论 -
【快慢指针 快结尾慢到中间】 876 链表的中间节点
题目链表的中间结点给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.原创 2020-07-27 11:25:49 · 91 阅读 · 0 评论 -
【快慢指针 不同起点 快两步慢一步 相遇停止】141 环形链表 环形链表的约瑟夫问题
题目给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。分析快慢指针,快指针一次两步慢指针一次一步。当快指针走到空时证明无环。如果有环,快慢指针必相遇。相遇后快指针回到起点,和慢指针一起走,再次相遇时为入口。公式推导环外链表的长度 = 第一次相遇点 + n-1次环的长度代码public class ListNode{ int val; ListNod原创 2020-06-03 00:51:52 · 264 阅读 · 0 评论 -
【双指针,滑动窗口;右指针寻找解,左指针寻找最优解】209 长度最小的子数组
题目给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。输入: s = 7, nums = [2,3,1,2,4,3]输出: 2解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。分析双指针。right右移,直到sum≥s,比较长度最小值。同时和减去最左值,left指针移动。直到sum<s为止。此时right继续移动。也就是小于s时,right移动,大于等于s时,left移原创 2020-06-07 00:15:28 · 88 阅读 · 0 评论 -
【双指针 不等时覆盖】 26 删除排序数组中的重复项
题目描述给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不需要使用额外的数组空间。思路分析【双指针】 要求删除重复元素,实际就是将不重复的元素移到左侧,采用覆盖的方法。当不相等时,两个指针同步后移,相等时,移动j,直到找到不相等的,然后让i+1等于当前j所指向的数。然后再进行后移。代码实现...原创 2020-02-19 22:20:08 · 105 阅读 · 0 评论 -
【快慢指针】61 旋转链表
题目给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。示例 1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4->5->1->2->3->NULL代码 public ListNode rotate原创 2020-07-27 09:20:58 · 81 阅读 · 0 评论 -
【双指针 快慢指针】19 删除链表倒数第N个元素
题目给定一个链表,删除链表的倒数第n个节点,并且返回头结点分析两次遍历:首先第一次遍历的得到长度。第二次遍历时,因为删除节点需要有被删除节点的前一个节点。考虑到只有一个节点、两个节点的情况这种极端情况。需要定义一个head前指针代码ListNode p1 = head;int len=0;while(p1!=null){ len++; p1 = p1.next;}int rem = len-n;/*因为删除节点需要有被删除节点的前一个节点。考虑到只有一个节点、两个节点原创 2020-06-04 00:41:28 · 189 阅读 · 0 评论 -
【双指针 固定一个双指针移动】 15 三数之和
题目给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:...原创 2020-06-11 18:00:30 · 152 阅读 · 0 评论 -
【双指针 缩减搜索空间】 11 盛最多水的容器
题目给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。输入:[1,8,6,2,5,4,8,3,7]输出:49思路双指针一头一尾,计算面积的最大值,每次移动的指针是两边指针指向更短柱子的其中一个指针。代码public int maxArea(int[] height) { int len =原创 2020-06-30 10:56:54 · 94 阅读 · 0 评论 -
【双指针 哈希表】1.两数之和
题目描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。思路分析一 暴力两层循环,遍历数组,找相加等于target的两个数,定义一个新数组进行存放、代码实现思路分析二 哈希表将数组放入哈希表中,定义一个遍历,寻找是否存在一个值,等于target-当下值。当这个值存在且不是其本身时,将两个下标放入新的数组中...原创 2020-02-19 20:39:19 · 211 阅读 · 0 评论