前言
- 关于技巧的题目想不出来直接抄答案好了,都是没遇到的算法可能
异或操作
```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
```
摩尔投票
```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
```
三指针
```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
```
换数+改升序
```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:])
```
原地哈希
```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终于刷完了!!(咆哮怒吼兴奋到处爬行),我要找实习!我要上岸!