【力扣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终于刷完了!!(咆哮怒吼兴奋到处爬行),我要找实习!我要上岸!
相关推荐
小熊猫程序猿6 小时前
Datawhale 算法笔记 AI硬件与机器人大模型 (五) Isaac Sim 入门
人工智能·笔记·机器人
CUMT_DJ8 小时前
matlab计算算法的运行时间
开发语言·算法·matlab
不太可爱的叶某人9 小时前
【学习笔记】kafka权威指南——第10章 监控kafka (7-10章只做了解)
笔记·学习·kafka
张人玉10 小时前
C# TCP 客户端开发笔记(TcpClient)
笔记·tcp/ip·c#
Univin11 小时前
C++(10.4)
开发语言·数据结构·c++
KyollBM11 小时前
每日羊题 (质数筛 + 数学 | 构造 + 位运算)
开发语言·c++·算法
Univin13 小时前
C++(10.5)
开发语言·c++·算法
躬身入世,以生证道13 小时前
面试技术栈 —— 简历篇
面试·职场和发展
Asmalin13 小时前
【代码随想录day 35】 力扣 01背包问题 一维
算法·leetcode·职场和发展
不太可爱的叶某人13 小时前
【学习笔记】kafka权威指南——第6章 可靠的数据传递
笔记·学习·kafka