双指针
经典的双指针解法面试题
Lc_summer
这个作者很懒,什么都没留下…
展开
-
双指针求解容器盛最多水问题
容器盛水问题题目链接题目描述给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。思路数组值相当于容器的边界,只有当左右边界不相邻且中间的高度低于左右边界,才能盛水,采用双指针记录当前的左右边界,minDepth记录当前的最低边界,开始时双指针指向左右边界,minDepth等于边界中的最小值,然后从最小值开始向中间移动,当移动到的地点比边界小,说明可以盛水。此时的容量 = minDepth - 当前值;如果当前值大于minDepth,说明此时不能盛水,同原创 2021-03-05 11:43:20 · 242 阅读 · 0 评论 -
分步法旋转字符串
左旋转字符串字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = “abcdefg”, k = 2输出: “cdefgab”示例 2:输入: s = “lrloseumgh”, k = 6输出: “umghlrlose”思路1.先将整个字符串反转2.接着反转前 size-n 字符3.最后反转后 n 个字符原创 2021-02-27 16:19:38 · 61 阅读 · 0 评论 -
分步求解单词反转问题
反转字符串里的每个单词给定一个字符串,逐个翻转字符串中的每个单词。说明:无空格字符构成一个 单词 。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。示例 1:输入:“the sky is blue”输出:“blue is sky the”示例 2:输入:" hello world! "输出:“world! hello”解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例原创 2021-02-27 16:18:59 · 74 阅读 · 0 评论 -
双指针替换空格
替换空格请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.”思路计算空格数,将原数组的长度扩大到size+count*2,双指针从后往前遍历,一个指向原数组,一个指向替换空格后的数组,,当指针相遇则替换完成string replaceSpace(string s){ int count = 0; for(auto c : s){ if(c == ' ') ++count;原创 2021-02-27 16:18:29 · 189 阅读 · 0 评论 -
双指针反转字符串
反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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-02-27 16:17:56 · 156 阅读 · 0 评论 -
快慢指针求解 链表环路问题
一个链表没有环,则遍历一遍会指向最后一个节点然后停下,如果一个存在环路则在遍历的时候会一直循环遍历环的各个节点,那么判断是否有环即判断否当前指针重复指向同一段内存单元,我们可以利用快慢指针来判断,如果遇到的结尾停止,则没有环,如果快慢指针相遇,则存在环路 bool hasCycle(ListNode *head) { if(head==NULL) return false; ListNode *fast = head->next;原创 2020-11-11 16:27:11 · 107 阅读 · 0 评论 -
双指针求数组中和等于target的四个数
四数之和给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。示例:给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。满足要求的四元组集合为:[[-1, 0, 0, 1],[-2, -1, 1, 2],[-2, 0, 0, 2]]思路原创 2021-02-26 16:37:23 · 208 阅读 · 0 评论 -
双指针求数组中和为0的三个数
三数之和给你一个包含 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]]思路先排序,再用双指针,首先遍历数组,双指针指向当前元素后的首尾位置,判断双指针指向的值之和是否==target - 当前的最小值 vector<vector<原创 2021-02-26 16:34:28 · 152 阅读 · 0 评论 -
双指针求解环形链表的入口
环形链表入口给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。示例:输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中有一个环,其尾部连接到第二个节点。思路:第一步,用快慢指针求解链表中是否有环,快指针每次后移两个节点,慢指针每次后移一个节点,快慢指针不为空且相等时则有环,否则无环;第二步,当快慢指针相遇时,快指针的路程是慢指针路程的两倍,假设起点A到环入口的路程为a,入口到环内的相遇点B的距离为b,此时慢指针原创 2021-02-26 11:46:05 · 172 阅读 · 0 评论 -
移除数组中的元素
移除元素给你一个数组 nums和一个值val,你需要原地移除所有数值等于val元素,并返回移除后数组的新长度,不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。思路:采用双指针,一个指针用来遍历原来的数组的所有元素,另一个指向不包含val的数组的元素,在遍历原数组的过程中,只需要将不是val的值复制到nums数组的前面int removeElement(vector<int>& nums,int原创 2021-02-25 17:44:47 · 413 阅读 · 0 评论