414. 第三大的数

图片.png

堆排序

  1. package main
  2. import (
  3. "container/heap"
  4. "fmt"
  5. "sort"
  6. )
  7. type IntList []int
  8. func (l IntList)Len()int{
  9. return len(l)
  10. }
  11. func(l IntList)Swap(i,j int){
  12. l[i],l[j] = l[j],l[i]
  13. }
  14. func(l IntList) Less(i, j int) bool{
  15. return l[i]<l[j]
  16. }
  17. func (l *IntList)Push(x interface{}){
  18. *l = append(*l,x.(int))
  19. }
  20. func (l *IntList)Pop()interface{}{
  21. x := (*l)[len(*l)-1]
  22. *l = (*l)[:len(*l)-1]
  23. return x
  24. }
  25. func thirdMax(nums []int) int {
  26. sort.Ints(nums)
  27. list := make(IntList,0)
  28. m :=make(map[int]struct{})
  29. heap.Init(&list)
  30. for i :=0;i<len(nums);i++{
  31. if _,ok:=m[nums[i]];!ok{
  32. heap.Push(&list,nums[i])
  33. m[nums[i]]= struct {}{}
  34. }
  35. }
  36. if len(list)<3 {
  37. return list[len(list)-1]
  38. }
  39. return list[len(list)-3]
  40. }
  41. func main() {
  42. fmt.Println(thirdMax([]int{3,2,1}))//1
  43. fmt.Println(thirdMax([]int{1,2}))//2
  44. fmt.Println(thirdMax([]int{2,2,3,1}))//1
  45. fmt.Println(thirdMax([]int{1,2,2,5,3,5}))//2
  46. fmt.Println(thirdMax([]int{1,-2147483648,2}))//-2147483648
  47. fmt.Println(thirdMax([]int{1,2,-2147483648}))//-2147483648
  48. }

图片.png

func thirdMax(nums []int) int {
    //sort.Ints(nums)
    //list := make(IntList,0)
    m :=make(map[int]struct{})
    //heap.Init(&list)
    var list []int
    for i :=0;i<len(nums);i++{
        if _,ok:=m[nums[i]];!ok{
            list =append(list,nums[i])
            m[nums[i]]= struct {}{}
        }

    }
    heapSort(list)
    if len(list)<3 {
        return list[0]
    }
    return list[2]
}

func heapSort(input []int){
    inputLen := len(input)
    if inputLen == 0 {
        return
    }
    for i:=0; i<inputLen; i++{
        minAjust(input[i:])
    }
}

func minAjust(input []int){
    inputLen := len(input)
    if inputLen <= 1{
        return
    }
    for i:= inputLen/2 -1; i>=0; i--{
        if (2*i+1 <= inputLen-1) && (input[i] <= input[2*i+1]){
            input[i], input[2*i+1] = input[2*i+1], input[i]
        }
        if (2*i+2<= inputLen-1) && (input[i] <= input[2*i+2]){
            input[i], input[2*i+2] = input[2*i+2], input[i]
        }
    }
}


func main() {
    fmt.Println(thirdMax([]int{3,2,1}))//1
    fmt.Println(thirdMax([]int{1,2}))//2
    fmt.Println(thirdMax([]int{2,2,3,1}))//1

    fmt.Println(thirdMax([]int{1,2,2,5,3,5}))//2
    fmt.Println(thirdMax([]int{1,-2147483648,2}))//-2147483648
    fmt.Println(thirdMax([]int{1,2,-2147483648}))//-2147483648

    //nums1 :=[]int{1,-2147483648,2}
    //heapSort(nums1)
    //fmt.Println(nums1)
    //nums2 :=[]int{1,2,-2147483648}
    //heapSort(nums2)
    //fmt.Println(nums2)
}