双指针算法的学习,简单笔记
1、算法解释
双指针的存在
- 主要用于遍历数组,两个指针指向不同的元素,协同完成任务
- 若两个指针指向同一数组、方向相同、不会相交,也称为滑动窗口
2、两数和问题
① LeetCode 167 两数之和 Ⅱ - 输入有序数组
解题思路
- 给定的数组已经按照升序排列了
- 设定双指针,分别指向头和尾,令其所指的数字相加,判断是否等于目标
- 若等于则返回;和大于目标则后指针向前移;和小于目标则前指针向后移
- 注: 前指针需小于后指针
Java解答
class Solution {
public int[] twoSum(int[] numbers, int target) {
int size = numbers.length;
int l_p = 0, r_p = size - 1;
int sum = 0;
while(l_p < r_p){
sum = numbers[l_p] + numbers[r_p];
if(sum == target){
return new int[]{
l_p+1, r_p+1};
} else if(sum > target){
r_p--;
} else if(sum < target){
l_p++;
}
}
return null;
}
}
3、归并两个有序数组
解题思路
- 给定的两个数组都是升序排好的
- 由于不是存入新的数组,而是将数组2合并到数组1中,且数组1已经扩容
- 设定两个指针,分别指向两个数组的末尾,比较所指的值大小
- 将大的值放入数组1末尾
- 已取过值的数组指针向前移动
Java解答
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1 = m - 1, p2 = n - 1;
int tail = m + n - 1;
int cur;
while (p1 >= 0 || p2 >= 0) {
if (p1 == -1) {
cur = nums2[p2--];
} else if (p2 == -1) {
cur = nums1[p1--