寻找第K大 网易2016实习研发工程师编程题

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。

给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

测试样例:

[1,3,5,2,2],5,3

返回:2

投机取巧能通过:

1 class Finder {
2 public:
3     int findKth(vector<int> a, int n, int K) {
4         // write code here
5         sort(a.begin(), a.end());
6         return a[n - K];
7     }
8 };

用快排思想:

 1 #include <iostream>
 2 #include <vector>
 3 #include <string>
 4 #include <queue>
 5 #include <stack>
 6 #include <unordered_map>
 7 #include <map>
 8 #include <algorithm>
 9 using namespace std;
10
11 //用快排的思想:例如找49个元素里面第24大的元素,那么按如下步骤:
12 //1.进行一次快排(将大的元素放在前半段,小的元素放在后半段), 假设得到的中轴为p
13 //2.判断 p - low == k -1,如果成立,直接输出a[p],(因为前半段有k - 1个大于a[p]的元素,故a[p]为第K大的元素)
14 //3.如果 p - low > k-1, 则第k大的元素在前半段,此时更新high = p - 1,继续进行步骤1
15 //4.如果 p - low < k-1, 则第k大的元素在后半段,此时更新low = p + 1, 且 k = k - (p - low + 1),继续步骤1.
16 //由于常规快排要得到整体有序的数组,而此方法每次可以去掉“一半”的元素,故实际的复杂度不是o(nlgn), 而是o(n)。
17 class Finder {
18 public:
19     int partation(vector<int>& a, int low, int high) {
20         int key = a[low];
21         while (low < high) {
22             while (low < high && a[high] <= key)
23                 high--;
24             a[low] = a[high];
25             while (low < high && a[low] >= key)
26                 low++;
27             a[high] = a[low];
28         }
29         a[low] = key;
30         return low;
31     }
32     int findKth(vector<int>& a, int low, int high, int k)
33     {
34         int part = partation(a, low, high);
35         if (k == part - low + 1)
36             return a[part];
37         else if (k > part - low + 1)
38             return findKth(a, part + 1, high, k - part + low - 1);
39         else
40             return findKth(a, low, part - 1, k);
41
42     }
43     int findKth(vector<int> a, int n, int K) {
44         // write code here
45         return findKth(a, 0, n - 1, K);
46     }
47 };
48
49
50 //测试
51 int main()
52 {
53     vector<int> v{ 1,3,5,2,2 };
54     Finder solution;
55     cout<<solution.findKth(v, 5, 3);
56 }
时间: 2024-10-05 18:34:21

寻找第K大 网易2016实习研发工程师编程题的相关文章

网易2016实习研发工程师编程题

牛客网上的题 1 比较重量 小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第二个元素为较轻的钻石的编号.最后给定之前的比较次数n.请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0.输入

网易2016 实习研发工程师 [编程题]寻找第K大 and leetcode 215. Kth Largest Element in an Array

传送门 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2],5,3 返回:2 note: 注意手写快排的时候: while(i < j) { while(j > i && a[j] > a[left]) j--; while(i < j && a[i] <= a[left]) i++; if(i

网易2016 实习研发工程师 [编程题]二叉树

传送门 有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离.二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离. 给定二叉树的根节点root,请返回所求距离. 题解: 给每个节点编号(0 - total),用map记录每个节点的父节点 找出最大权值叶子节点 和 最小权值 叶子节点的编号 然后就是寻找最近公共祖先了 1 /* 2 struct TreeNode { 3 int val; 4 struct Tree

比较重量 网易2016实习研发工程师编程题

题目: 小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第 二个元素为较轻的钻石的编号.最后给定之前的比较次数n.请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0.输入数据保证合 法,不

网易 2016 实习研发工程师 3道 编程题-2

有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离.二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离. 给定二叉树的根节点root,请返回所求距离. //import java.util.ArrayList;   //import java.util.HashMap;   //import java.util.Iterator;   //import java.util.LinkedList;   //imp

网易 2016 实习研发工程师 3道 编程题-1

小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第二个元素为较轻的钻石的编号.最后给定之前的比较次数n.请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0.输入数据保证合法,不会有矛盾情况

求职 | 华为研发工程师编程题个人题解【C++】【Python】

华为研发工程师编程题[C++][Python][数学][数组][字符串] 问题1 有这样一道智力题:"某商店规定:三个空汽水瓶可以换一瓶汽水.小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?"答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子.然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板.如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝? 输入描述: 输入文件最多包

网易 2016 实习研发project师 3道 编程题

1 比較重量 给定两颗钻石的编号g1,g2,编号从1開始.同一时候给定关系数组vector,当中元素为一些二元组.第一个元素为一次比較中较重的钻石的编号,第二个元素为较轻的钻石的编号.最后给定之前的比較次数n. 请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法推断返回0. 输入数据保证合法,不会有矛盾情况出现. 測试例子: 2,3,[[1,2],[2,4],[1,3],[4,3]],4 返回: 1 class Cmp { public: int cmp(int g1, int g

搜狐2016研发工程师编程题

1.[编程题]马戏团 搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演.考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等. 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题.小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列.