力扣-Hot100-双指针篇

122 阅读2分钟

283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

思路:定义快慢指针,快指针指向非0位置,慢指针指向0位置进行交换,最终能保证所有的0都放在最后

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        i = j = 0
        while j < n:
            if nums[j]:
                nums[i], nums[j] = nums[j], nums[i]
                i += 1
            j += 1
        

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明: 你不能倾斜容器。

思路:要使得水量最大,j - i, height[i]height[j]也要尽可能大,可以让i=0j=n-1,当height[j]较大时,让指针i右移;height[i]较大时,让指针j左移。每次记录水量为min(height[i],height[j]) * (j-i)返回最大值。

class Solution:
    def maxArea(self, h: List[int]) -> int:
        n = len(h)
        i = res = 0
        j = n - 1
        while i < j:
            res = max(res, (j - i) * min(h[i], h[j]))
            if h[i] > h[j]:
                j -= 1
            else:
                i += 1
        return res

15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意: 答案中不可以包含重复的三元组。

思路:这个题细节好多,值得我做十遍。 思路:如果是两个数字的和为0,我们可以将数组排序,当两数之和大于0时,让右指针左移。小于0时,让左指针右移。

类比一下,如果求三个数字的和,我们给数组排序,先固定一个数字nums[i],然后进行双指针运算。

在指针移动的过程中,要保证三元组不重复,要保证当前循环下不能再选择相同的元素。只要保证nums[i]、nums[j]不相同,nums[k]一定会不相同。

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        n = len(nums)
        nums.sort()
        res = []
        for i in range(n):
            if i and nums[i] == nums[i - 1]:
                continue
            j, k = i + 1, n - 1
            while j < k:
                while j > i + 1 and j < n and nums[j] == nums[j - 1]:
                    j += 1
                if j >= k:
                    break
                t = nums[i] + nums[j] + nums[k]
                if t > 0:
                    k -= 1
                elif t < 0:
                    j += 1
                else:
                    res.append([nums[i], nums[j], nums[k]])
                    j += 1
        return res