LeetCode | 703.数据流中的第K大元素
这次来写一下 LeetCode 的第 703 题,数据流中的第 k 大元素。
题目描述
题目直接从 LeetCode 上截图过来,题目如下:
上面的题就是 数据流中的第K大元素 题目的截图,同时 LeetCode 给出了一个类的定义,然后要求实现 数据流中的第K大元素 的完整的算法。这次我同样没有使用 C 语言,而是使用了 C++ 语言,整个类的定义如下:
class KthLargest {
public:
KthLargest(int k, vector<int>& nums) {
}
int add(int val) {
}
};
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest* obj = new KthLargest(k, nums);
* int param_1 = obj->add(val);
*/
从上面的类定义可以看出,这次实现的是一个算法,也需要把题目给出的类的所有成员函数进行实现。
问题分析
这题的思路是先将给的数组进行排序,然后像数组添加元素时进行有序的插入,每次取倒数第 k 个元素即可。这次使用了 C++ 中的两个函数,分别是 sort 和 lower_bound,这两个函数的用法如下:
- sort 的使用方法 对给定的数组进行排序,默认按照从小到大的方式进行排序
- lower_bound 的使用方法 查找大于或等于 val 的第一个元素位置,如果所有元素都小于 val,则返回 last 的位置
代码实现
依据我的思路来写代码,代码还是比较简单的,代码如下:
class KthLargest {
private:
vector<int> m_nums;
int m_k;
public:
KthLargest(int k, vector<int>& nums) {
m_nums = nums;
m_k = k;
sort(m_nums.begin(), m_nums.end());
}
int add(int val) {
m_nums.insert(lower_bound(m_nums.begin(), m_nums.end(), val), val);
return m_nums[m_nums.size() - m_k];
}
};
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest* obj = new KthLargest(k, nums);
* int param_1 = obj->add(val);
*/
整个代码的逻辑并不复杂,进行简单的描述。
具体做法是在构造函数中将数组进行排序,在 add 函数插入元素的时候,找到元素应该插入的位置进行插入,保持数组的有序性。最后将数组中倒数第 k 个元素返回即可。
提交结果
在写完 KthLargest 类后,点击右下角的 “执行代码”,然后观察 “输出” 和 “预期结果” 是否一致,一致的话就点击 “提交” 按钮。点击 “提交” 按钮后,系统会使用更多的测试用例来测试我们写的函数体,如果所有的测试用例都通过了,那么就会给出 “通过” 的字样,如果没有通过,会给出失败的那一组测试用例,我们继续修改代码。我们以上代码 “提交” 以后的截图如下:
上面的代码是我第一次能想到的代码,代码的执行时间太长了,可以优化的空间很大。如果有空我去优化了它,我再来分享吧。
- struts2+spring+hibernate整合步骤(1)
- 微信公众号问题:{"errcode":40125,"errmsg":"invalid appsecret, view more at http://t.cn/LOEdzVq, hints: [
- reflow和repaint(摘录自张鑫旭的翻译)
- git删除本地分支
- org.springframework.data.redis.serializer.SerializationException: Cannot serialize;
- 样式化加载失败的图片
- 使用telnet命令验证邮箱(r4笔记第19天)
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存
- 前端开发中的字符编码
- 算法工程师的面试难不难,如何准备?-图像处理/CV/ML/DL到HR面总结
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(九)Linux下安装redis及redis的常用命令和操作
- 通过使用hint unnest调优sql语句(r4笔记第38天)
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十一)redis密码设置、安全设置
- 极简增强学习新手教程 返回专栏查看评论
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 同事直呼666!小姐姐仅用3行代码就能玩出花来
- MySQL升级至8.0需要考虑哪些因素?
- 某云Music——JS破解全过程
- 和低效 IO 说再见,回头补一波 Java 7 的 NIO.2 特性
- 框架源码调试实战之easypoi异常解决方案精讲
- MySQL8.0的错误日志
- Shiro学习笔记(一)
- Shiro学习笔记(二)
- Shiro学习笔记 三(认证授权)
- Shiro学习笔记四(Shiro集成WEB)
- Shiro学习笔记五(Shiro标签,及通配符)
- Shiro学习笔记六(自定义Reaml-使用数据库设置 user roles permissions)
- Luncene学习 第一天 《入门程序》
- Luncene学习二《搜索索引》
- JavaWeb--简单分页技术