【力扣hot100】刷题笔记Day3

前言

  • 以撒真是一不小心就玩太久了,终于解锁骨哥嘞,抓紧来刷题,今天是easy双指针!

283. 移动零 - 力扣(LeetCode)

  • 一个指针遍历找非0,一个指针用于把0换到后面
  • class Solution(object):
        def moveZeroes(self, nums):
            pre = 0  # 用于交换前面的0
            for i in range(len(nums)):
                if nums[i] != 0:  # 遍历到非0
                    nums[i], nums[pre] = nums[pre], nums[i]  # 交换
                    pre += 1
            return nums

 11. 盛最多水的容器 - 力扣(LeetCode)

  • 左右双指针,柱子较矮的往中间靠拢(因为最大盛水容器受限于最矮柱子)
  • class Solution(object):
        def maxArea(self, height):
            l, r = 0, len(height) - 1  # 首尾双指针
            res = 0
            while l != r:  # 往中间靠拢
                # 记录最大雨水量
                res = max(res, min(height[l], height[r]) * (r - l))  
                if height[l] < height[r]:  # 较矮的往中间移,相等随便
                    l += 1
                else:
                    r -= 1
            return res

 15. 三数之和 - 力扣(LeetCode)

  • 基本沿袭之前三数之和C++版本的思路,排序 + 双指针 +剪枝去重
  • class Solution(object):
        def threeSum(self, nums):
            res = list()
            nums.sort()  # 先排序
            n = len(nums)
            for i in range(n):
                if nums[i] > 0:  # 大于0后面不可能相加等于0了,直接break
                    break
                if i > 0 and nums[i] == nums[i - 1]:  # i去重
                    continue
                l, r = i + 1, n - 1  # 前后双指针
                while l < r:
                    sum = nums[i] + nums[l] + nums[r]
                    if sum < 0:
                        l += 1
                    elif sum > 0:
                        r -= 1
                    else:
                        res.append([nums[i], nums[l], nums[r]])
                        while l < r and nums[l + 1] == nums[l]:  # l去重
                            l += 1
                        while l < r and nums[r - 1] == nums[r]:  # r去重
                            r -= 1
                        l += 1
                        r -= 1
            return res

42. 接雨水 - 力扣(LeetCode)

  • 灵神的题解很清晰,除了之前刷的单调栈的思路,这里用相向双指针前后更新最高柱子
  • 本质原理:对于每一格雨水,向左找最高和向右找最高,两个最高取最小再减去当前柱高
  • class Solution:
        def trap(self, height: List[int]) -> int:
            res = l_max = r_max = 0
            l, r = 0, len(height) - 1  # 相向双指针
            while l < r:
                l_max = max(l_max, height[l])  # 左边最高
                r_max = max(r_max, height[r])  # 右边最高
                if l_max < r_max:  # 单格雨水受限于两侧较小的最高柱
                    res += l_max - height[l]
                    l += 1
                else:
                    res += r_max - height[r]
                    r -= 1
            return res

后言

  • 有前面的基础,刷起题目一下子就能懂啦,而且python写起来还是很顺手滴 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值