典型的topk问题

查找第K大的元素

http://www.nowcoder.com/questionTerminal/673454422d1b4a168aed31e449d87c00

想到第k大元素, 很明显就是topk问题
第k大就是要利用堆的特性

思路

维护一个k大小的最小堆, 然后把剩下的元素依次与堆顶进行比较, 如果大于堆顶就舍弃堆顶元素把更大的元素作为新堆顶, 然后向下调整维护堆的性质
时间复制度, 建堆 (k/2)log(k) , 维护第k大, (n-k)log(k), 最终时间复杂度 = O(nlog(k))
这个题中是第三大的元素, 所以k = 3

代码

Golang

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

var heap []int
var heapCap, heapSize = 0, 3

func main() {
    var num int
    heapSize = 3
    sc := bufio.NewScanner(os.Stdin)
    sc.Scan()
    str := sc.Text()
    heap = append(heap, 0)
    for _, numstr := range strings.Split(str[1:len(str)-1], ",") {
        num, _ = strconv.Atoi(numstr)
        heap = append(heap, num)
    }
    heapCap = len(heap) - 1
    makeHeap(heapSize)
    getTopK(heapSize)
    fmt.Println(heap[1])
}
// heapSize
func siftDown(i int) {
    var tmp int
    for i*2 <= heapSize {
        if heap[i] > heap[i*2] {
            tmp = i*2
        }else{
            tmp = i
        }
        if i*2+1 <= heapSize {
            if heap[tmp] > heap[i*2+1] {
                tmp = i*2+1
            }
        }
        if tmp != i {
            swap(tmp, i)
            i = tmp
        }else{
            break
        }
    }
}

func siftUp(tmp int) {
    for tmp != 1 {
        if heap[tmp] < heap[tmp/2] {
            swap(tmp, tmp/2)
        }
        tmp /= 2
    }
}

func makeHeap(size int) {
    for i := size; i > size/2; i-- {
        siftUp(i)
    }
}

func swap(a, b int) {
    heap[a], heap[b] = heap[b], heap[a]
}

func getTopK(k int) {
    for i:=k+1; i <= heapCap; i++ {
        if heap[i] > heap[1] {
            heap[1] = heap[i]
            siftDown(1)
        }
    }
}

Cpp

#include <bits/stdc++.h>

#define  ends " "
using namespace std;
int h[101] = {0};

int main() {
    int num = 0, k = 3;
    priority_queue<int, vector<int>, greater<int> > mHeap;
    while (getchar() != ']') {
        cin >> h[num++];
    }
    for(int i=0;i<k;i++) {
        mHeap.push(h[i]);
    }
    for(int i=k;i<num;i++){
        if (h[i]>mHeap.top()) {
            mHeap.pop();
            mHeap.push(h[i]);
        }
    }
    cout << mHeap.top() << endl;
    return 0;
}
全部评论

相关推荐

就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
06-12 16:23
已编辑
小米_软件开发(准入职员工)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务