算法双指针应用

110 阅读1分钟

1. 基础应用

适用背景1: 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]

核心代码:

# 指针从同一侧走
class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        nums1 = sorted(nums1)
        nums2 = sorted(nums2)
        n1 = 0
        n2 = 0
        ret = []
        while n1 < len(nums1) and n2 < len(nums2):
            if nums1[n1] == nums2[n2]:
                ret.append(nums1[n1])
                n1 += 1
                n2 += 1
            elif nums1[n1] < nums2[n2]:
                n1 += 1
            else:
                n2 += 1
        return ret

适用背景2: 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
# 指针从两边走
class Solution:
    def intersect(self, data):
        l = 0
        r = len(data) - 1
        while l < r:
            data[l], data[r] = data[r], data[l]
            l += 1
            r -= 1
        return data