双指针技巧框架

本文详细介绍了双指针技巧在解决链表和数组问题中的常见应用,包括快慢指针判断链表环、寻找环起点、找链表中点,以及左右指针对于二分查找、两数之和和滑动窗口问题的解决方案。通过实例代码解析了这些经典算法的实现逻辑。
摘要由CSDN通过智能技术生成

双指针分类

双指针一般分为两类:快慢指针和左右指针。

快慢指针主要解决链表问题,比如判断链表中是否有环、环的结点在哪

左右指针主要解决数组(或字符串)问题,比如二分查找,滑动窗口等。

快慢指针常见用法

1.判断链表中是否有环

boolean hasCycle(ListNode head) {
    ListNode fast, slow;
    fast = slow = head;
    while (fast != null && fast.next != null) {
        fast = fast.next.next;
        slow = slow.next;

        if (fast == slow) return true;
    }
    return false;
}

2.找出链表中环的起始位置

ListNode detectCycle(ListNode head) {
    ListNode fast, slow;
    fast = slow = head;
    while (fast != null && fast.next != null) {
        fast = fast.next.next;
        slow = slow.next;
        
        if (fast == slow){
			slow = head;
		    while (slow != fast) {
		        fast = fast.next;
		        slow = slow.next;
		    }
		    return slow;
		}
    }
    return null;
}

3.找到链表的中点

ListNode middleNode(ListNode head) {
    ListNode fast, slow;
    fast = slow = head;
    while (fast != null && fast.next != null) {
        fast = fast.next.next;
        slow = slow.next;
    }
    // slow 就在中间位置
    return slow;
}

左右指针常见用法

1.二分查找

二分查找算法模板

2.两数之和问题

int[] twoSum(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while (left < right) {
        int sum = nums[left] + nums[right];
        if (sum == target) {
            // 题目要求的索引是从 1 开始的
            return new int[]{left + 1, right + 1};
        } else if (sum < target) {
            left++; // 让 sum 大一点
        } else if (sum > target) {
            right--; // 让 sum 小一点
        }
    }
    return new int[]{-1, -1};
}

3.滑动窗口

滑动窗口算法模板

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值