【力扣hot100】刷题笔记Day27

前言

  • 关于技巧的题目想不出来直接抄答案好了,都是没遇到的算法可能

136. 只出现一次的数字 - 力扣(LeetCode)

异或操作

复制代码
```python
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        # 异或运算:
        # 1. a ^ 0 = a
        # 2. a ^ a = 0
        # 3. 满足交换律和结合率
        res = 0
        for num in nums:
            res = res ^ num  # 把所有的数进行异或,两个的消成0,再和1个的异或得到1个的
        return res
```

169. 多数元素 - 力扣(LeetCode)

摩尔投票

复制代码
```python
class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        votes = 0
        for num in nums:
            # 如果票数为0,则众数在剩下的集合里,重新设置当前数为众数 
            if votes == 0: x = num   
            # 和众数相同的票数+1,和众数不同的票数-1       
            votes += 1 if num == x else -1 
        return x
```

75. 颜色分类 - 力扣(LeetCode)

三指针

复制代码
```python
class Solution:
    def sortColors(self, nums: List[int]) -> None:
        n = len(nums)
        if n < 2: return
        def swap(nums, i, j):
            nums[i], nums[j] = nums[j], nums[i]
        # 以下区间结合为全区间
        # all in [0, zero) = 0
        # all in [zero, i) = 1
        # all in [two, len - 1] = 2
        # 各指针初始化为空区间
        zero = 0
        i = 0
        two = n
        while i < two:  # 当 i == two 上面的三个子区间正好覆盖了全部数组
            if nums[i] == 0:        # [0, zero)取不到,先换再加
                swap(nums, i, zero)
                i += 1
                zero += 1
            elif nums[i] == 2:
                two -= 1            # [two, len - 1]取得到,先减再换
                swap(nums, i, two)
            else:
                i += 1
```

31. 下一个排列 - 力扣(LeetCode)

换数+改升序

复制代码
```python
class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        if len(nums) <= 1:
            return

        # 寻找查找第一个相邻升序的元素对(i,i+1),满足A[i]<A[i+1],[i+1,end)为降序
        i = len(nums) - 2
        while i >= 0 and nums[i] >= nums[i + 1]:
            i -= 1

        # 如果i不是 -1,说明找到了相邻升序的元素对(i,i+1)
        if i >= 0:
            # 在[i+1,end)中寻找第一个大于 nums[i] 的元素的位置k,且k必须在i之后
            k = len(nums) - 1
            while nums[i] >= nums[k] and k > i:
                k -= 1
            # 交换 nums[i] 和 nums[k]
            nums[i], nums[k] = nums[k], nums[i]

        # 反转从 i+1 到数组末尾的部分,以生成下一个排列
        nums[i+1:] = reversed(nums[i + 1:])
```

287. 寻找重复数 - 力扣(LeetCode)

原地哈希

复制代码
```python
class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        n = len(nums)
        i = 0
        while i < n:
            # 如果要放的地方已经被占了,说明找到重复数
            if nums[i] == nums[nums[i]]:
                return nums[i]  
            # 如果没有,就把nums[i]放到下表为nums[i]处,交换
            else:
                tmp = nums[i]
                nums[i], nums[tmp] = nums[tmp], nums[i]
            # 如果当前位置已放好,i往后移动
            if i == nums[i]:
                i += 1
        return -1
```

环形链表

复制代码
```python
class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        def next(i):
            return nums[i]
        slow = fast = 0
        # 第一次相遇
        while True:
            slow = next(slow)
            fast = next(next(fast))
            if slow == fast:
                break
        slow = 0
        # 第二次相遇
        while slow != fast:
            slow = next(slow)
            fast = next(fast)
        return slow
```

后言

  • Hot100终于刷完了!!(咆哮怒吼兴奋到处爬行),我要找实习!我要上岸!
相关推荐
艾醒3 分钟前
大模型原理剖析——解耦RoPE(旋转位置编码)的基本原理
算法
@淡 定6 分钟前
JVM内存区域划分详解
java·jvm·算法
❀͜͡傀儡师11 分钟前
运维问题排查笔记:磁盘、Java进程与SQL执行流程
java·运维·笔记
客梦15 分钟前
数据结构-单链表
数据结构
M__3316 分钟前
动规入门——斐波那契数列模型
数据结构·c++·学习·算法·leetcode·动态规划
LYFlied41 分钟前
Vue3虚拟DOM更新机制源码深度解析
前端·算法·面试·vue·源码解读
薛不痒1 小时前
机器学习算法之集成学习随机森林和贝叶斯
算法·机器学习·集成学习
竹一阁1 小时前
跟踪导论(十二)——卡尔曼滤波的启动:初始参数的设置
算法·信号处理·雷达·信号与系统
QT 小鲜肉1 小时前
【Linux命令大全】001.文件管理之find命令(实操篇)
linux·运维·前端·chrome·笔记
youngee111 小时前
hot100-48课程表
算法