自定义heapify实现求解数组第K大元素出错原因排查
数组中的第K个最大元素堆实现问题
我在解决数组中的第K个最大元素问题时,选择手动实现堆来完成,而非直接使用内置堆结构。我的代码如下:
def findKthLargest(self, nums: List[int], k: int) -> int: def heapify(nums: List[int], i: int): print(nums, i) largest = i left = (2 * i) + 1 right = (2 * i) + 2 if left < len(nums) and nums[largest] < nums[left]: largest = left if right < len(nums) and nums[largest] < nums[right]: largest = right if largest != i: nums[i], nums[largest] = nums[largest], nums[i] print(nums) heapify(nums, largest) print(nums) for i in range(len(nums)-1, -1, -1): heapify(nums, i) print(nums) return nums[k-1]
这段代码参考了官方题解的实现,官方题解代码如下:
def max_heapify(heap_size, index): left, right = 2 * index + 1, 2 * index + 2 largest = index if left < heap_size and lst[left] > lst[largest]: largest = left if right < heap_size and lst[right] > lst[largest]: largest = right if largest != index: lst[index], lst[largest] = lst[largest], lst[index] max_heapify(heap_size, largest) # heapify original lst for i in range(len(lst) // 2 - 1, -1, -1): max_heapify(len(lst), i)
我的代码仅通过了21/41个测试用例,比如在输入:
nums = [3,2,3,1,2,4,5,5,6] k = 4
时,返回结果是3,但正确答案应该是4。我的代码运行打印输出如下:
[3, 2, 3, 1, 2, 4, 5, 5, 6] [3, 2, 3, 1, 2, 4, 5, 5, 6] 8 [3, 2, 3, 1, 2, 4, 5, 5, 6] 7 [3, 2, 3, 1, 2, 4, 5, 5, 6] 6 [3, 2, 3, 1, 2, 4, 5, 5, 6] 5 [3, 2, 3, 1, 2, 4, 5, 5, 6] 4 [3, 2, 3, 1, 2, 4, 5, 5, 6] 3 [3, 2, 3, 6, 2, 4, 5, 5, 1] [3, 2, 3, 6, 2, 4, 5, 5, 1] 8 [3, 2, 3, 6, 2, 4, 5, 5, 1] 2 [3, 2, 5, 6, 2, 4, 3, 5, 1] [3, 2, 5, 6, 2, 4, 3, 5, 1] 6 [3, 2, 5, 6, 2, 4, 3, 5, 1] 1 [3, 6, 5, 2, 2, 4, 3, 5, 1] [3, 6, 5, 2, 2, 4, 3, 5, 1] 3 [3, 6, 5, 5, 2, 4, 3, 2, 1] [3, 6, 5, 5, 2, 4, 3, 2, 1] 7 [3, 6, 5, 5, 2, 4, 3, 2, 1] 0 [6, 3, 5, 5, 2, 4, 3, 2, 1] [6, 3, 5, 5, 2, 4, 3, 2, 1] 1 [6, 5, 5, 3, 2, 4, 3, 2, 1] [6, 5, 5, 3, 2, 4, 3, 2, 1] 3 [6, 5, 5, 3, 2, 4, 3, 2, 1]
我注意到索引5处的4在初始几次迭代后从未被调整,请问这是为什么?我遗漏了什么?希望得到帮助。
内容的提问来源于stack exchange,提问作者Hemanth Annavarapu
相关产品推荐
相关产品推荐

