1.这个通过partition实现topk,时间复杂度是o(logn*logn),也就是0(n),但需要修改原数组的顺序

下面这个代码本身有一些错误,并且throw excption会在牛客上报错

class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> result;
int length = input.size();
if(input.empty() || length <= || k <= || length < k)
return result;
int start = ;
int end = length - ;
int index = partition(input,length,start,end);
while(index != k-){
if(index > k-){
end = index-;
index = partition(input,length,start,end);
}
else{
start = index + ;
index = partition(input,length,start,end);
}
}
for(int i = ;i <= index;i++)
result.push_back(input[i]);
return result;
}
int partition(vector<int> &input,int length,int start,int end){
if(input.empty() || length <= || start < || end >= length)
throw new exception("Invalid Parameters");
int small = -;
for(int i = start;i <= end;i++){
if(input[i] <= input[end]){
start++;
if(start != i)
swap(&input[start],&input[i]);
}
}
small++;
swap(&input[small],&input[end]);
return small;
}
};

正确代码

class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> result;
int length = input.size();
if(input.empty() || length <= || k <= || length < k)
return result;
int start = ;
int end = length - ;
int index = partition(input,start,end);
while(index != k-){
if(index > k-){
end = index - ;
index = partition(input,start,end);
}
else{
start = index + ;
index = partition(input,start,end);
}
}
for(int i = ;i < k;i++)
result.push_back(input[i]);
return result;
}
int partition(vector<int> &input,int start,int end){
int small = start - ;
for(int i = start;i < end;i++){
if(input[i] < input[end]){
small++;
if(small != i)
swap(input,small,i);
}
}
small++;
swap(input,small,end);
return small;
}
void swap(vector<int>& input,int a,int b){
int tmp = input[a];
input[a] = input[b];
input[b] = tmp;
}
};

2.用大根堆的做法的时间复杂度是o(nlogk)

topk两种解法的更多相关文章

  1. Java描述表达式求值的两种解法:双栈结构和二叉树

    Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...

  2. 51nod 1165 整边直角三角形的数量(两种解法)

    链接:http://www.51nod.com/Challenge/Problem.html#!#problemId=1165 直角三角形,三条边的长度都是整数.给出周长N,求符合条件的三角形数量. ...

  3. Letter Combinations of a Phone Number:深度优先和广度优先两种解法

    Letter Combinations of a Phone Number Given a digit string, return all possible letter combinations ...

  4. 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)

    [Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...

  5. leetcode-91-解码方法(动态规划和递归两种解法)

    题目描述: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数 ...

  6. POJ 1157 LITTLE SHOP OF FLOWERS (超级经典dp,两种解法)

    You want to arrange the window of your flower shop in a most pleasant way. You have F bunches of flo ...

  7. Sort List[leetcode] 由归并排序的递归和循环,到本题的两种解法

    归并排序能够有两种思路----top-down 和 bottom-up top-down: 递归实现,将数组分成两半.分别处理.再合并. 伪代码例如以下: split ( A[], l, r) { i ...

  8. POJ 1182食物链(分集合以及加权两种解法) 种类并查集的经典

    题目链接:http://icpc.njust.edu.cn/Problem/Pku/1182/ 题意:给出动物之间的关系,有几种询问方式,问是真话还是假话. 定义三种偏移关系: x->y 偏移量 ...

  9. [LeetCode] Validate Binary Search Tree (两种解法)

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

随机推荐

  1. [编程] C语言结构体指针作为函数参数

    结构体指针作为函数参数:结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针.如果结构体成员较多,尤其是成员为数组时,传送的时间和空间 ...

  2. 十四、curator recipes之DistributedAtomicLong

    简介 和Java的AtomicLong没有太大的不同DistributedAtomicLong旨在分布式场景中维护一个Long类型的数据,你可以像普通单机环境一样来使用它. 官方文档:http://c ...

  3. 给<input>文本框添加灰色提示文字

    value="你的提示文字" onFocus="if(value==defaultValue){value='';this.style.color='#000'}&quo ...

  4. 撩课-Web大前端每天5道面试题-Day3

    1. javascript的typeof返回哪些数据类型? 答案: undefined string boolean number symbol(ES6) Object Function 2. 列举3 ...

  5. 经典的SQL面试题及答案

    ​ ​ ​ ​ ​ ​​​​​ ​ ​​​​​​​​

  6. javaweb浏览器url上项目名称的更改

    如何改变上面url项目名称地址,如把04去掉改成teachershare 如下图:在项目设置中设置web context-root属性,将04去掉. 就可以用这个登录了. 要注意的是如果之前已经部署在 ...

  7. BZOJ4671:异或图

    传送门 直接求连通的不好做,考虑容斥 设 \(g_i\) 表示至少有 \(i\) 个连通块的方案数,\(f_i\) 表示恰好有 \(i\) 个的 那么 \[g_x=\sum_{i=x}^{n}\beg ...

  8. Java线程的周期及五种状态

    线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌握了 ...

  9. Python之正则表达式模块

    正则表达式符号: . ^ $ * + ? {} () | [] .一个点代表一个字符 ^代表开头 $代表结尾 *代表有0到无数个 [0,+00] ?代表有0到1个      [0,1] +代表有1到无 ...

  10. AngularJS+RequireJs实现动态加载JS和页面的方案研究【上】

    1.入口页面 存放地址:src/main/webapp/WEB-INF/view/workflow/workflow.jsp [html] view plain copy 在CODE上查看代码片派生到 ...