Skip to content

优化阶段

  • 全局排序
  • 冒泡排序、简单选择排序
  • 大根堆
冒泡排序

冒泡选出最大的k个元素,这样做,会超时;

js
func findKthLargest(nums []int, k int) int {

	var ans []int
    ans = bubble_find_max(nums,k)
    return ans[0]
}

func bubble_find_max(nums []int, k int) []int {
	leng := len(nums)
    if (k == 0 && leng == 0) || k > leng{
        return []int{} 
    }
	for i := range k {
		for j:=0; j<leng-i-1; j++ { // 不用比较最后一个元素,所以-1
            if nums[j] > nums[j+1] {
                nums[j], nums[j+1] = nums[j+1],nums[j]
            }
		}
	}
    return nums[leng-k:]
}

func select_find_max(nums []int, k int) []int {
    	leng := len(nums)
    if (k == 0 && leng == 0) || k > leng{
        return []int{} 
    }
	for i := range k {
        max := i
		for j:=i+1; j<leng; j++ { // j<leng,表示可以取到最后一个元素,j<leng-1,表示可以取到倒数第二个元素
            if nums[j] > nums[max] {
                max = j;
            }
		}
        if (max!=i){
            nums[i], nums[max] = nums[max],nums[i]
        }
	}
    return nums[:k]
}

大根堆(小顶堆) 堆排序

叶子节点:在数组中,[len(nums)/2, len(nums)-1] 这些下标的节点都是叶子节点(没有孩子)。 非叶子节点:[0, len(nums)/2 - 1] 这些下标的节点才有孩子,才需要进行堆化调整。

go
func buildHeap(nums []int){
    
    var heap []int;
    copy(heap, nums);

    for i:=len(nums)/2-1;i>=0;i--{
        minHeapify(nums, i)
    }
    return heap
}
func minHeapify(nums []int, i int){
    smallest := i
    left := 2*i + 1
    right := 2*i + 2

    if left < len(nums) && nums[left] < nums[smallest]{
        smallest = left;
    }

    if right < len(nums) && nums[right] < nums[smallest]{
        smallest = right;
    }

    if smallest != i {
        nums[i], nums[smallest] = nums[smallest], nums[i]
        minHeapify(nums, smallest)
    }
}
本站访客数 人次 本站总访问量