核心内容摘要
MAAAssistantArknights智能更新机制:如何让游戏助手始终保持最佳状态?
数组中的第K个最大元素核心思想假设数组升序排列后是[1,2,3,4,5,6]n6第 2 大元素是 5对应下标
不管数组是否有序「第 K 大元素在升序数组中的下标永远是n-k」随机选 pivot 后通过双指针划分能精准确定 pivot 的最终下标 j划分后j左边的元素 ≤ pivot右边的元素 ≥ pivotnums[j]就是数组中「第 n-j 大」的元素缩圈直到命中」迭代找目标下标二分法的lowerbound如果j n-k直接返回nums[j]找到答案如果j n-k目标在左区间[left, j-1]缩小范围继续找如果j n-k目标在右区间[j1, right]缩小范围继续找。
为什么必须随机一个 pivot如果固定排序每次的第一个遇到有序数组时一次性只能排序一个位置最终时间复杂度是On²随机就是保证时间复杂度稳定在n最难的是Partition函数Partition划分的核心作用随机选一个基准值pivot把数组划分为「pivot」和「pivot」两部分返回pivot的最终下标j此时class Solution: def findKthLargest(self, nums: List[int], k: int) - int: def partition(nums,left,right): i randint(left,right) pivot nums[i] nums[i],nums[left] nums[left],nums[i] i,j left1,right while True: while ij and nums[i]pivot: i 1 while ij and nums[j]pivot: j - 1 if ij: break nums[i],nums[j] nums[j] ,nums[i] i 1 j - 1 nums[left],nums[j] nums[j],nums[left] return j n len(nums) target n-k left,right 0, n-1 while True: i partition(nums,left,right) if itarget: return nums[i] elif itarget: right i-1 else: left i