1.荷兰国旗问题`lc75
class Solution:
def sortColors(self, nums: List[int]) -> None:
n = len(nums)
p0 = p1 = 0
for i in range(n):
if nums[i] == 1:
nums[i], nums[p1] = nums[p1], nums[i]
p1 += 1
elif nums[i] == 0:
nums[i], nums[p0] = nums[p0], nums[i]
if p0 < p1:
nums[i], nums[p1] = nums[p1], nums[i]
p0 += 1
p1 += 1
2.三路 lc324摆动序列
class Solution:
def wiggleSort(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
if n < 2: return nums
mid = (0 + n - 1) // 2 # 中位数索引
# 快速排序中的一次划分
def partition(begin, end):
left, right = begin, end
while left < right:
while left < right and nums[left] < nums[right]: right -= 1
if left < right:
nums[left], nums[right] = nums[right], nums[left]
left += 1
while left < right and nums[left] < nums[right]: left += 1
if left < right:
nums[left], nums[right] = nums[right], nums[left]
right -= 1
return left
# 找到中位数对应的数值
left, right = 0, n - 1
while True:
pivot = partition(left, right)
if pivot == mid:
break
elif pivot > mid:
right = pivot - 1
else:
left = pivot + 1
# 三路划分(荷兰旗)
midNum = nums[mid]
left, curr, right = 0, 0, n - 1
while curr < right:
if nums[curr] < midNum:
nums[left], nums[curr] = nums[curr], nums[left]
left += 1
curr += 1
elif nums[curr] > midNum:
nums[curr], nums[right] = nums[right], nums[curr]
right -= 1
else:
curr += 1
# 交叉合并
small, big, _nums = mid, n - 1, nums[:]
for i in range(n):
if i % 2 == 0:
nums[i] = _nums[small]
small -= 1
else: # big
nums[i] = _nums[big]
big -= 1
# leetcode submit region end(Prohibit modification and deletion)
3.lc215topk
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
def findTopKth(low, high):
pivot = random.randint(low, high)
nums[low], nums[pivot] = nums[pivot], nums[low]
base = nums[low]
i = low
j = low + 1
while j <= high:
if nums[j] > base:
nums[i + 1], nums[j] = nums[j], nums[i + 1]
i += 1
j += 1
nums[low], nums[i] = nums[i], nums[low]
if i == k - 1:
return nums[i]
elif i > k - 1:
return findTopKth(low, i - 1)
else:
return findTopKth(i + 1, high)
return findTopKth(0, len(nums) - 1)
本文探讨了三种不同的算法问题:荷兰国旗问题的解决方案、使用快速排序实现的三路摆动序列调整,以及查找数组中第k大的元素的方法。通过实例代码展示了如何在Python中高效地解决这些经典问题,适合算法爱好者和开发者参考。
235

被折叠的 条评论
为什么被折叠?



