【HOT100】DAY2

盛最多水的容器

双指针,通过指针大小控制循环;更小的高参与迭代。

python 复制代码
class Solution:
    def maxArea(self, height: List[int]) -> int:
        left = 0
        right = len(height) - 1
        max_area = 0
        while left < right:
            high = min(height[left], height[right])
            width = right - left
            current_area = high * width
            max_area = max(current_area, max_area)
            if height[left] < height[right]:
                left += 1
            else:
                right -= 1
        return max_area

三数之和

循环,i作为一个指针;循环内双指针,左右分别剪枝/去重;通过三数之和的大小决定双指针移动方向

python 复制代码
class Solution:
    def threeSum(self, nums: list[int]) -> list[list[int]]:
        n = len(nums)
        res = []
        if n < 3:
            return res
        
        nums.sort()
        for i in range(n):
            if nums[i] > 0:
                break
            if i > 0 and nums[i] == nums[i - 1]:
                continue
            
            left = i + 1
            right = n - 1
            while left < right:
                sum_three = nums[i] + nums[left] + nums[right]
                if sum_three == 0:
                    res.append([nums[i], nums[left], nums[right]])
                    while left < right and nums[left] == nums[left + 1]:
                        left += 1
                    while left < right and nums[right] == nums[right - 1]:
                        right -= 1
                    left += 1
                    right -= 1
                elif sum_three < 0:
                    left += 1
                else:
                    right -= 1
        return res

接雨水

每次只做一步动作,接水和移动指针错开,左右也错开。移动的下一步要是比当前大,就更新大小,若比当前小,二者差值就是雨水数量。

python 复制代码
class Solution:
    def trap(self, height: List[int]) -> int:
        n = len(height)
        if n < 3:
            return 0
        
        left = 0
        right = n - 1
        left_max = 0
        right_max = 0
        total_water = 0

        while left < right:
            if height[left] < height[right]:
                if height[left] >= left_max:
                    left_max = height[left]
                else:
                    total_water += left_max - height[left]
                left += 1
            else:
                if height[right] >= right_max:
                    right_max = height[right]
                else:
                    total_water += right_max - height[right]
                right -= 1
        
        return total_water

无重复字符的最长子串

哈希+滑动窗口,用s的序号当作右指针并参与循环。

python 复制代码
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        hash_map = {}
        max_length = 0
        left = 0
        for right, char in enumerate(s):
            if char in hash_map and hash_map[char] >= left:
                left = hash_map[char] + 1
            hash_map[char] = right
            current_length = right - left + 1
            max_length = max(current_length, max_length)
        return max_length
相关推荐
Flittly12 小时前
【LangGraph新手村系列】(5)时间旅行:浏览历史、分叉时间线与修改过去
python·langchain
绛橘色的日落(。・∀・)ノ12 小时前
机器学习之评估与偏差方差分析
算法
消失的旧时光-194312 小时前
C语言对象模型系列(四)《Linux 内核里的 container_of 到底是什么黑魔法?》—— 一篇讲透 Linux 内核的“对象模型”核心技巧
linux·c语言·算法
2301_7820404512 小时前
CSS Flex布局中如何实现导航栏与Logo的左右分布_利用justify-content- space-between
jvm·数据库·python
yaoxin52112313 小时前
400. Java 文件操作基础 - 使用 Buffered Stream I/O 读取文本文件
java·开发语言·python
AI_Ming13 小时前
从0开始学AI:层归一化,原来是这回事!
算法·ai编程
WL_Aurora13 小时前
备战蓝桥杯国赛【Day 8】
算法·蓝桥杯
用户83562907805113 小时前
使用 Python 自动创建 Excel 折线图
后端·python
智者知已应修善业13 小时前
【51单片机模拟生日蜡烛】2023-10-10
c++·经验分享·笔记·算法·51单片机
MediaTea13 小时前
Scikit-learn:从数据到结构——无监督学习的最小闭环
人工智能·学习·算法·机器学习·scikit-learn