“取最大的K的数”的两种解法
输入n个整数,输出其中最大的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为5,6,7和8。
解法一
开一个容量为K的最小堆。每次来一个数,比较堆顶(最小值)和这个数谁大,如果当前的数更大,就替换掉堆顶。时间复杂度 \(O(n \log k)\)
输入n个整数,输出其中最大的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为5,6,7和8。
开一个容量为K的最小堆。每次来一个数,比较堆顶(最小值)和这个数谁大,如果当前的数更大,就替换掉堆顶。时间复杂度 \(O(n \log k)\)
目前 Ghost 最高支持到 Node 4.X
1 | curl -sL https://deb.nodesource.com/setup_4.x | bash - |
原题:http://hihocoder.com/problemset/problem/1137?sid=476594
大意是:
有N个应聘者,分别知道他们的价值V,期望薪水S,以及性别。招聘要求是:男X名,女Y名,总预算B(即期望薪水之和不能超过B),如何使总价值最大?
看完了《背包九讲》,找个OJ练练手。
原题参考: http://poj.org/problem?id=1276
大意是:一个取款机有N种钞票,每种钞票有n[k]张,面额为D[k],给定一个取款金额cash,可行的、不超过该金额的吐钞方案是多少钱?
前几天Google onsite面试,已挂。今天仔细思考了面试中一道没写出来的题,发现也并不难。诶,只能怪当时脑抽了。
给定一个巨大的无序数组,输出数组中出现次数最多的K个数。
参数都是一样的:
make_heap(first ,last)
make_heap(first ,last, cmpObject)
将[first, last)范围进行堆排序,默认使用less<int>,
即最大元素放在第一个。
pop_heap(first ,last)
pop_heap(first ,last, cmpObject)
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5
这题看似很简单,但是务必考虑如下情形:
时间复杂度最低的方法是,修改归并排序(Merge Sort),在排序同时对逆序对计数。时间复杂度为 \(O(n\log{n})\)。