LeetCode 题解(1):双指针法
learn from cyc2018 and LeetCode
双指针法指的是:在遍历对象的过程中,不使用单个指针进行访问,而是用两个相同方向或者相反方向的指针进行扫描,从而达到相应的目的。双指针问题的本质是由于两个或者多个元素有相互作用或者相关联。
167. TWO SUM II - Input array is sorted (easy)
问题描述
在有序数组中找到两个数字,使其和为一特定值。函数返回两个数的索引,其中索引 1 小于索引 2。
你可以假设每次输入只有一组特定解,并且不能使用同一元素两次。
1 | // example |
题解
1 | class Solution { |
相关问题
653. TWO SUM IV - Input is a BST (easy)
633. Sum of Squared Numbers (easy)
问题描述
给定一个非负整数 $c$ ,判断是否存在两个整数 $a$ 和 $b$ 使得:$a^2 + b^2 = c$
1 | // example |
题解
失败经历(一)
限定两个边界分别为 $0$ 和 $sqrt(c)$,结果出现如下错误:
1 | // Input: 2147482647 |
正解
将类型由 int 改为 long
1 | class Solution { |
相关问题
367. Valid Perfect Square (easy)
345. Reverse Vowels of a String (easy)
问题描述
翻转字符串中的元音字母。
1 | // example |
题解
1 | class Solution { |
相关问题
680. Valid Palindrome II (easy)
问题描述
给定非空字符串s,最多可以删除一个字符。判断你是否能把它变成回文。
1 | // example |
题解
采用分治法可以很好的解决问题。
1 | class Solution { |
相关问题
88. Merge Sorted Array (easy)
问题描述
归并两个有序数组 $nums1$ 和 $nums2$ 。将 $nums2$ 中数据归并至 $nums1$ 中。
- $nums1$ 和 $nums2$ 中元素个数分别为:$m$,$n$
- $nums1$ 中空间足够大
1 | // example |
题解
失败经历(一)
1 | class Solution { |
结果为:

Runtime 过长。
正解
1 | class Solution { |
从尾开始遍历,防止在 $nums1$ 上归并得到的值覆盖尚开始归并的值。

相关问题
21. Merge Two Sorted Lists (easy)
977. Squares of a Sorted Array (easy)
986. Interval List Intersections (medium)
141. Linked List Cycle (easy)
问题描述
判断一个链表中是否有环。
题解
失败经历(一)
不会做。。
正解
使用双指针,一个指针每次移动一个节点,另一个指针每次移动两个节点,如果存在环,那么这两个指针一定会相遇。
1 | class Solution { |

结果显示时间复杂度与空间复杂度都不太好,需要进一步优化。
但是查了一下似乎这种情况已经是最优解了,时间复杂度为 $O(n)$ 空间复杂度为 $O(1)$ 。所以换了一个版本:
1 | bool hasCycle(ListNode *head) { |

发现速度已经足够了。
相关问题
142. Linked List Cycle II (medium)
524. Longest Word in Dictionary through Deleting (medium)
问题描述
给定一个字符串和一个字符串字典,在字典中查找可以通过删除给定字符串的一些字符来形成的最长字符串。如果有多个可能的结果,则返回词序最小的最长单词。如果没有可能的结果,返回空字符串。
1 | // example |
题解
1 | class Solution { |