博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer 最小的k个数 leetcode 215. Kth Largest Element in an Array
阅读量:7124 次
发布时间:2019-06-28

本文共 3310 字,大约阅读时间需要 11 分钟。

注意multiset的一个bug:

multiset带一个参数的erase函数原型有两种。一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数;另外一种是传递一个指向某个元素的iterator,这时候删除的就是这个对应的元素,无返回值。

https://www.cnblogs.com/lakeone/p/5600494.html

删除的时候一定不能删除指针,只能删除迭代器

leetcode那个题就是在这个地方出错的:

Input: [3,2,3,1,2,4,5,5,6,7,7,8,2,3,1,1,1,10,11,5,6,2,4,7,8,5,6] 20
Output: 3

Expected: 2

如果container.erase(*con),最后小根堆的大小就只有19个

container.erase(con)才是正确的

 

剑指offer 最小的k个数:

 这是partition版本的

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

 这是基于大根堆的:

class Solution {public:    vector
GetLeastNumbers_Solution(vector
input, int k) { vector
output; int length = input.size(); if(input.empty() || k <= 0 || length < k) return output; multiset
> numbers; multiset
>::iterator greaternumber; vector
::iterator iter = input.begin(); for(;iter != input.end();iter++){ if(numbers.size() < k) numbers.insert(*iter); else{ greaternumber = numbers.begin(); if(*greaternumber > *iter){ numbers.erase(*greaternumber); numbers.insert(*iter); } } } for(greaternumber = numbers.begin();greaternumber != numbers.end();greaternumber++){ output.push_back(*greaternumber); } return output; }};

leetcode 215. Kth Largest Element in an Array

小根堆

class Solution {public:    int findKthLargest(vector
& nums, int k) { int length = nums.size(); if(length <= 0 || k <= 0 || length < k) return -1; multiset
> container; multiset
>::iterator con; vector
::iterator it = nums.begin(); for(;it != nums.end();it++){ if(container.size() < k) container.insert(*it); else{ con = container.begin(); if(*con < *it){ container.erase(con); container.insert(*it); } } } int min_num = 0x7FFFFFFF; for(con = container.begin();con != container.end();con++){ if(*con < min_num) min_num = *con; } return min_num; }};

 

你可能感兴趣的文章
URI、URL、URN 的联系和区别
查看>>
docker常用命令
查看>>
delphi 线程学习
查看>>
redis之主从复制理论简单说明
查看>>
Intel新的Clover Trail芯片将会支持Android,Linux
查看>>
在阿里云上打造属于你自己的APEX完整开发环境 (安装CentOS, Tomcat, Nginx)
查看>>
karaf 2 ssh连接karaf
查看>>
nginx重写规则隐藏index.php
查看>>
Android性能优化典范 - 第1季(番外:内存)
查看>>
算法-求二进制数中1的个数
查看>>
如何在gitlab上下载其他人的私有项目
查看>>
Android性能优化工具之TraceView
查看>>
Executor 与 ExecutorService
查看>>
事务的隔离级别(Transaction isolation levels)
查看>>
国内maven镜像
查看>>
链表的各种操作(Java实现)
查看>>
git命令行下怎么查看当前分支是基于哪一个分支的,以决定是否可以执行git rebase...
查看>>
十进制小数的二进制,八进制,十六进制转换方法
查看>>
一整套WordPress模板制作的教程
查看>>
CAP理论
查看>>