Skip to main content

双指针

David LiuAbout 1 min

双指针

相向双指针:一头一尾

同向双指针:一前一后

两数之差问题

On

很多数据量大的问题的时候不允许用hash表

当不能使用哈希表时

可以在排序数据集上进行二分来替代
不能使用哈希表的情况比如数据集很大
或者题目要求不适用额外空间

数组+二分可以起到hashmap的作用

一个for,一个while

public int[] twoSum(int[] nums, int target) {
    target = Math.abs(target);
    int j = 1;
    for (int i = 0; i < nums.length; i++) {
        j = Math.max(j, i + 1);
        while (j < nums.length && nums[j] - nums[i] < target) {
            j++;
        }
        if (j >= nums.length) {
            break;
        }
        if (nums[j] - nums[i] == target) {
            return new int[]{nums[i], nums[j]};
        }
    }
    
    return new int[]{-1, -1};
}

同向双指针模板

截屏2022-08-09 23.07.56

双指针:不产生额外空间

移除重复元素

int deduplication(int[] nums) {
	if (nums == null || nums.length == 0) {
        return 0;
	}
    
    Arrays.sort(nums);
    int j = 1;
    for (int i = 0; i < nums.length; i++) {
        while (j < nums.length && nums[j] == nums[i]) {
            j++;
        }
        if (j >= nums.lenght) {
            break;
        }
        nums[i + 1] = nums[j];
    }
    
    return i + 1;
}

滑动窗口求和

windowSum

子数组或子字符串基本就是同向双指针

快慢指针

On空间的话,可以用hash表去记录是否有节点被走两次