【力扣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终于刷完了!!(咆哮怒吼兴奋到处爬行),我要找实习!我要上岸!
相关推荐
WWZZ20256 分钟前
快速上手大模型:机器学习3(多元线性回归及梯度、向量化、正规方程)
人工智能·算法·机器学习·机器人·slam·具身感知
四谎真好看1 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
东方佑1 小时前
从字符串中提取重复子串的Python算法解析
windows·python·算法
西阳未落2 小时前
LeetCode——二分(进阶)
算法·leetcode·职场和发展
通信小呆呆2 小时前
以矩阵视角统一理解:外积、Kronecker 积与 Khatri–Rao 积(含MATLAB可视化)
线性代数·算法·matlab·矩阵·信号处理
Dfreedom.2 小时前
一文掌握Python四大核心数据结构:变量、结构体、类与枚举
开发语言·数据结构·python·变量·数据类型
报错小能手2 小时前
linux学习笔记(45)git详解
linux·笔记·学习
CoderCodingNo3 小时前
【GESP】C++四级真题 luogu-B4068 [GESP202412 四级] Recamán
开发语言·c++·算法
一个不知名程序员www3 小时前
算法学习入门---双指针(C++)
c++·算法
Larry_Yanan3 小时前
QML学习笔记(四十四)QML与C++交互:对QML对象设置objectName
开发语言·c++·笔记·qt·学习·ui·交互