范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

面试高频系列TopK问题的多种解法冒泡排序ampampamp快速排序ampampamp优先队列

  文章描述
  该文章是公众号:宫水三叶 博主的文章,一位女神级别的算法大佬,文章大都是讲算法的,公众号广告基本没有,只分享算法心得,解题思路不要不要的,一句话很强,
  原文链接:https://mp.weixin.qq.com/s/zVon8BE7l80-RT5bWdKCxA题目描述
  这是 LeetCode 上的 「703. 数据流中的第 K 大元素」 ,难度为 「Easy」 。
  设计一个找到数据流中第 k 大元素的类(class)。
  注意是排序后的第 k 大元素,不是第 k 个不同的元素。
  请实现 KthLargest 类:  KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。  int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。
  示例:  输入: ["KthLargest", "add", "add", "add", "add", "add"] [[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]]  输出: [null, 4, 5, 5, 8, 8]  解释: KthLargest kthLargest = new KthLargest(3, [4, 5, 8, 2]); kthLargest.add(3);   // return 4 kthLargest.add(5);   // return 5 kthLargest.add(10);  // return 5 kthLargest.add(9);   // return 8 kthLargest.add(4);   // return 8
  提示:  1 <= k <=  0 <= nums.length <=   <= nums[i] <=   <= val <=  最多调用 add 方法 次  题目数据保证,在查找第 k 大元素时,数组中至少有 k 个元素  冒泡排序解法(TLE)
  每次调用  add  时先将数装入数组,然后遍历 k  次,通过找 k  次最大值来找到 Top K。
  代码:  class KthLargest {     int k;     List list = new ArrayList<>(10009);     public KthLargest(int _k, int[] _nums) {         k = _k;         for (int i : _nums) list.add(i);     }     public int add(int val) {         list.add(val);         int cur = 0;         for (int i = 0; i < k; i++) {             int idx = findMax(cur, list.size() - 1);             swap(cur++, idx);         }         return list.get(cur - 1);      }     int findMax(int start, int end) {         int ans = 0, max = Integer.MIN_VALUE;         for (int i = start; i <= end; i++) {             int t = list.get(i);             if (t > max) {                 max = t;                 ans = i;             }         }         return ans;     }     void swap(int a, int b) {         int c = list.get(a);         list.set(a, list.get(b));         list.set(b, c);     } } 时间复杂度:  空间复杂度:  快速排序解法
  上述的解法时间复杂度是 的,当  k  很大的时候会超时。
  我们可以使用快排来代替冒泡。
  将复杂度变为 ,不能说 复杂度一定比 要低,但 通常更加接近 。
  本题的  n  的范围是 , 解法的效率等于一个常数为 15 以内的 算法:
  代码:  class KthLargest {     int k;     List list = new ArrayList<>(10009);     public KthLargest(int _k, int[] _nums) {         k = _k;         for (int i : _nums) list.add(i);     }          public int add(int val) {         list.add(val);         Collections.sort(list);         return list.get(list.size() - k);     } } 时间复杂度:  空间复杂度:
  PS. Collections.sort 内部最终会调用 Arrays.sort 进行排序。而 Arrays.sort() 本身不只有「双轴快排」一种实现,在排序数量少的情况下会直接使用「冒泡排序」,这里的分析是假定了 Collections.sort 最终使用的是 Arrays.sort 的「双轴快排」。  优先队列解法
  使用优先队列构建一个容量为  k  的小根堆。
  将  nums  中的前 k  项放入优先队列(此时堆顶元素为前 k  项的最大值)。
  随后逐项加入优先队列:  堆内元素个数达到  k  个: 加入项小于等于堆顶元素:加入项排在第  k  大元素的后面。直接忽略 加入项大于堆顶元素:将堆顶元素弹出,加入项加入优先队列,调整堆  堆内元素个数不足  k  个,将加入项加入优先队列
  将堆顶元素进行返回(数据保证返回答案时,堆内必然有  k  个元素)。
  代码:  class KthLargest {     int k;     PriorityQueue queue;     public KthLargest(int _k, int[] _nums) {         k = _k;         queue = new PriorityQueue<>(k, (a,b)->Integer.compare(a,b));         int n = _nums.length;         for (int i = 0; i < k && i < n; i++) queue.add(_nums[i]);         for (int i = k; i < n; i++) add(_nums[i]);     }     public int add(int val) {         int t = !queue.isEmpty() ? queue.peek() : Integer.MIN_VALUE;         if (val > t || queue.size() < k) {             if (!queue.isEmpty() && queue.size() >= k) {                 queue.poll();             }             queue.add(val);         }         return queue.peek();     } } 时间复杂度:最坏情况下, n  个元素入堆,都触发堆调整。复杂度为 空间复杂度:  最后
  这是我们「刷穿 LeetCode」系列文章的第  No.703  篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先将所有不带锁的题目刷完。
  在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

小猪佩奇的电竞路改名是觉得好玩,实力是练出来的JPL风云人物志他们是剑网3职业联赛(JPL)赛场上最亮眼的一群人,来自天南海北,因各种方式与剑网3结缘,成为站在竞技巅峰的职业选手。外界对他们的了解并不少,他们自己又是如何看待自最终幻想3与圣剑传说2的最大功臣,来自伊朗的天才程序员对于主机游戏经历有一定年份的玩家来说,最终幻想是个难以忽略的名字,不但具有左右业界版图的实力,也是知名度高到甚至特地介绍都嫌多余的游戏大作。但对于不玩游戏的大部分人类来说,FF可能DNF马蹄卡做成LOL英雄是不是特强?零伤害但很肉相信现在的大部分玩家都玩过LOL,LOL里的英雄设计,你找不到没有伤害的英雄。但是如果出一个没有伤害的英雄(当然只是对英雄没有伤害)会有人玩吗?我相信设计的可能不是很好大家不会喜欢光环无限前期最适合开荒的五把士官长专属武器大家好,这里是玩咖游戏宝典,本次玩咖游戏就带大家一起来看看光环无限中在前期最适合玩家开荒的五把士官长专属武器。这五把武器都是光剑一样属于特殊收集品,不受主线剧情影响,完成支线任务后这些经久不衰的玩法都玩过吗?10年过去仍然流行,依然火爆有话不妨直说,有理请你来辩!兄弟们,我是莽夫。元旦在家没干别的,莽夫打了好久的战地,战地的玩法太过于经典,导致莽夫突然觉得游戏界好像有很多这种因为某一种玩法的流行,导致后继者都没法热血传奇特殊属性不重要吗?我是多多,继续讲解传奇,2。魔法头盔即便比青铜头盔多了11的魔御属性数据,可是也只能够算低端头盔,上面这顶魔法头盔就特别特殊了,06的防御力属性数据超过圣战头盔的防御力最大值,关键宝可梦画风不同的地面系大佬,四天王菊野有哪些拿手精灵?宝可梦里有不少使用地面系的大佬,但是使用地面系的大佬给人都是一种很有魄力的感觉,从坂木到菊老大都是如此,但是,地面系大佬本就不多,四代的菊野虽然是个上了年纪的老太太,但是却给人一种粉圆变成了蘑菇的形状,英雄联盟玩家自制了提莫珍珠奶茶珍珠奶茶(Bubbletea)是大家非常喜欢的饮料。虽然只是在奶茶中加入木薯粉圆,但却成为台湾省最具代表性的饮料之一。珍珠奶茶使用的珍珠,也就是粉圆,在加入奶茶之前,通常还会先浸泡头号玩家要成真了吗?2021年虚拟五感科技产品盘点2012年,IBM提出了一个名为认知计算的概念,它认为计算机是可以模拟人的五感,帮助人们完成不方便做的工作,更好地与人们沟通等。现实正朝着IBM预测的方向前进,听觉嗅觉味觉触觉。。Steam平台12月硬件调查报告!Steam玩家最常用显卡配置信息PC最大游戏平台Steam近日发布了2021年12月份硬件和软件调查报告,该调查匿名收集玩家的电脑软硬件种类数据,对于PC玩家很有参考意义。12月份各项数据与之前相比,变化最大的是被年轻玩家嫌弃,曾经称霸中国市场的MMO游戏如何自救?12月29日,由西山居研发并发行的MMO手游剑侠世界3上线,当天,游戏登上AppStore免费榜第一畅销榜前十,交出了一份还算满意的答卷。剑侠世界3是2021年最后一款MMO新产品
无聊就来玩这些,这些手游味道满满论道江湖在这里,你可以做一个狂刀饮血的大魔头,也可以成为一名仗剑走江湖的侠客当然也可以和你心爱的她(他)默默练功,隐世不出,过一过与人无争的世外桃源生活。战三国八阵奇谋名将列阵,一热门的手游快满上,如此有趣你不心动吗?像素射击这是一款3D像素风格的多人在线第一人称沙盒射击游戏。完美的操作手感,为你带来刺激的射击体验!幻塔虚幻4引擎打造自由无缝亚夏世界,动作捕捉系统赋予角色真实动态,多样场景交互所有趣的手游,你喜欢其中哪一款?最后的英雄最后的英雄在核心玩法上,除了技能,装备资源拾取等前作继承元素外,最大的创新是在于随从系统的设计。我们思考的是,在战场中除了捡装备捡道具之外,难道没有办法变得更有趣了吗?于值得推荐的手游,它们给你不一样的感觉沙盒勇者沙盒勇者是一款像素风格的沙盒游戏。玩家将在怪物洗劫后的废土中重建村庄,自由设计你的要塞,部署防御建筑,招募同伴帮助你对抗怪物,收集隐藏的宝藏打造强力装备,提高自己的实力。技这些好手游,宅家再久都不怕阿卡迪亚当不安的萌芽再度复苏,新的篇章刚刚启封是战乱重现,毁灭降临还是英雄登场,停止纷争?镜之大陆的秘密都将掌握在你的手中,寻找神之子的路途,终点是何处?在这场命运的终点,绘出你的这些手游值得一玩,休闲不二选择古代战争放置救世主古代战争放置救世主是一款魔幻风格的角色扮演类游戏,该作具备卡通式的游戏画面,玩家们将操控主角在不一样的场景下开启无限的冒险,并且丰富的玩法要素也将确保大家的游戏体九阴真经已经陪伴玩家十几年,官方满满诚意,只为回馈新老玩家其实大家一直都比较喜欢武侠这个主题,不管是之前的一些小说,还是电视剧中,大家都一般选择武侠来进行观看。其实在最近有很多游戏,也开始发展一些武侠风,但是有的游戏已经有了十年的时间,但是游戏,也是文化,九阴真经真武侠诠释最传统的中国武侠文化在我国武侠文化大行其道,许多武侠题材都特别的火爆,比如武侠游戏,在网络游戏当中也是一份独特的存在。这几年随着游戏食堂的崛起,而许多游戏公司也瞄准的这块蛋糕。在这几年里网络世界当中诞九阴真经一夜暴富,对武侠最有发言权,体验真正的江湖气息如果说起我们国家的一些武侠类的游戏,相信最有发言权的应该是十几年前刚开始发行的一款游戏,当时这款游戏非常火爆,并且一夜之间受到大家的欢迎,它就是九阴真经。这款游戏可以说应该是很多男精品手游,这些游戏真有趣黑衣人英雄远征黑衣人英雄远征手机版类似模拟器玩法的小游戏,主角需要通过前后左右的跑动配合跳跃翻滚2段连跳卧倒等不同的动作组合并且配合使用滑翔伞踩高跷时间停止火箭飞车等道具来完成一系周末好手游,感受真正的快乐天际征服这是一个高魔的奇幻架空世界,破碎大陆在经历大毁灭之后成为一片焦土,魔法丧失殆尽,巴别之城成为了仅存的文明都市,聚集着不同种族的生物,而魔法源的紊乱导致城市里出现次元裂缝,这