热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode215:TopKLargestElementsEfficientlyExplained

本文详细解析了LeetCode第215题,即高效寻找数组中前K个最大元素的问题。通过使用快速选择算法(partition),可以在平均时间复杂度为O(N)的情况下完成任务。本文不仅提供了算法的具体实现步骤,还深入探讨了partition算法的工作原理及其在不同场景下的应用,帮助读者更好地理解和掌握这一高效算法。

这种前几大的题通通用partition就可以在O(N)时间内解决,之所以要特意写个题解是因为想把partition的算法记下来,每次写都写得很纠结

程序看着比较奇怪,因为我是找的前k大,然后再找前k大里面最小的,之所以这样是为了复用之前 https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/description/ 的函数

type pair struct {
v int
p int
}func maxProfit(k int, prices []int) int {
n := len(prices)
stack := make([]pair, n)
profits := make([]int, 0, n)
v := 0
p := -1
top := 0
for true {
for v = p + 1; v+1 = prices[v+1]; v++ {
}
for p = v; p+1 1]; p++ {
}
//fmt.Println(v,p)
if v == p {
break
}
/*case 1, do nothing but pop the last vp pair and put them into the profit array
/
for top > 0 && prices[v] <&#61; prices[stack[top-1].v] {
profits &#61; append(profits, prices[stack[top-1].p]-prices[stack[top-1].v])
top--
}
/case 2, merge the two vp pairs
*/

for top > 0 && prices[p] >&#61; prices[stack[top-1].p] {
profits &#61; append(profits, prices[stack[top-1].p]-prices[v])
v &#61; stack[top-1].v
top--
}
stack[top] &#61; pair{v: v, p: p}
top&#43;&#43;
}
for top > 0 {
profits &#61; append(profits, prices[stack[top-1].p]-prices[stack[top-1].v])
top--
}
ans :&#61; 0
//fmt.Println(profits)
if len(profits) <&#61; k {
ans &#61; accumulate(profits)
return ans
}
ans &#61; accumulate(firstKLargest(profits, k))
return ans}func accumulate(arr []int) int{
n :&#61; len(arr)
ans :&#61; 0
for i :&#61; 0; i ans &#43;&#61; arr[i]
}
return ans
}func firstKLargest(slice []int, k int) []int {
length :&#61; len(slice)if length <&#61; k {return slice
}m :&#61; slice[rand.Intn(length)]less :&#61; make([]int, 0, length)
more :&#61; make([]int, 0, length)
equal :&#61; make([]int, 0, length)for _, item :&#61; range slice {switch {case item append(less, item)case item > m:more &#61; append(more, item)default :equal &#61; append(equal, item)}
}
if len(more) > k {return firstKLargest(more, k)
} else if len(more) &#61;&#61; k {return more
}else if len(more) &#43; len(equal) >&#61; k{more &#61; append(more, equal[:k-len(more)]...)//fmt.Println("debug more",more)return more
}
more &#61; append(more, equal...)
// fmt.Println("Less", less)
// fmt.Println("More", more)
// fmt.Println("Equal", equal)
part :&#61; firstKLargest(less, k-len(more))
return append(part, more...)
}



推荐阅读
  • 在数据库事务处理中,InnoDB 存储引擎提供了多种隔离级别,其中 READ COMMITTED 和 REPEATABLE READ 是两个常用的选项。本文详细对比了这两种隔离级别的特点和差异,不仅从理论角度分析了它们对“脏读”和“幻读”的处理方式,还结合实际应用场景探讨了它们在并发控制和性能表现上的不同。特别关注了行锁机制在不同隔离级别下的行为,为开发者选择合适的隔离级别提供了参考。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 在HDU 1166敌军布阵问题中,通过运用线段树数据结构,可以高效地计算指定区间的敌军数量。该算法不仅能够在限定的时间和内存条件下快速求解,还能够灵活应对动态变化的战场局势,为实时决策提供支持。 ... [详细]
  • 算法专题:罗马数字转换为整数详解与实现 ... [详细]
  • 优化升级版数据采集与赋值方法,专为前文内容设计
    在前一篇文章中,方法的局限性主要体现在需要传递参数,并且参数数量受限。当页面布局与所需参数不匹配时,该方法将无法正常工作。为此,我们推出了优化升级版1.1,旨在解决这些问题并提高灵活性和适用性。 ... [详细]
  • 本次发布的Qt音乐播放器2.0版本在用户界面方面进行了细致优化,提升了整体的视觉效果和用户体验。尽管核心功能与1.0版本保持一致,但界面的改进使得操作更加直观便捷,为用户带来了更为流畅的使用体验。此外,我们还对部分细节进行了微调,以确保软件的稳定性和性能得到进一步提升。 ... [详细]
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • 本文详细解析了九度编程平台上的斐波那契数列高效算法挑战(题目编号:1387)。该挑战要求在1秒的时间限制和32兆的内存限制下,设计出高效的斐波那契数列计算方法。通过多种算法的对比和性能分析,本文提供了优化方案,帮助参赛者在限定资源条件下实现高效计算。 ... [详细]
  • 在Ubuntu 13.04系统中,如果希望移除OpenJDK以优化Java环境配置,但尝试卸载`openjdk-7-jre`时遇到了问题。具体命令 `$ sudo apt-get purge openjdk-7-jre` 会显示如下提示信息: ... [详细]
  • 本文详细介绍了在 Python 中使用 OpenCV 进行图像处理的各种方法和技巧,重点讲解了腐蚀(erode)和膨胀(dilate)操作,以及开运算和闭运算的应用。腐蚀操作可以去除前景物体的边缘部分,而膨胀操作则可以扩展前景物体的边界。开运算和闭运算则是结合这两种基本操作,用于消除图像中的噪声和填充空洞,提高图像处理的效果。通过具体的代码示例和实际应用案例,读者可以深入理解这些技术在图像处理中的重要作用。 ... [详细]
  • MongoDB高可用架构:深入解析Replica Set机制
    MongoDB的高可用架构主要依赖于其Replica Set机制。Replica Set通过多个mongod节点的协同工作,实现了数据的冗余存储和故障自动切换,确保了系统的高可用性和数据的一致性。本文将深入解析Replica Set的工作原理及其在实际应用中的配置和优化方法,帮助读者更好地理解和实施MongoDB的高可用架构。 ... [详细]
  • 织梦系统多条件联动筛选功能详细教程及删除操作指南
    多条件联动筛选功能广泛应用于图片展示、装修设计、机械设备和在线商城等场景,通常筛选条件应聚焦于用户最关心的要素,而非涵盖所有可能的选项。在DedeCMS中,多条件筛选的PHP开发并未内置删除已选条件的功能,但通过理解PHP筛选与JS筛选的不同机制,实现这一功能相对简单且易于操作。 ... [详细]
  • Prim算法在处理稠密图时表现出色,尤其适用于边数远多于顶点数的情形。传统实现的时间复杂度为 \(O(n^2)\),但通过引入优先队列进行优化,可以在点数为 \(m\)、边数为 \(n\) 的情况下显著降低时间复杂度,提高算法效率。这种优化方法不仅能够加速最小生成树的构建过程,还能在大规模数据集上保持良好的性能表现。 ... [详细]
  • 我正在使用 Ruby on Rails 构建个人网站。总体而言,RoR 是一个非常出色的工具,它提供了丰富的功能和灵活性,使得创建自定义页面变得既高效又便捷。通过利用其强大的框架和模块化设计,我可以轻松实现复杂的功能,同时保持代码的整洁和可维护性。此外,Rails 的社区支持也非常强大,为开发过程中遇到的问题提供了丰富的资源和解决方案。 ... [详细]
  • 理工科男女不容错过的神奇资源网站
    十一长假即将结束,你的假期学习计划进展如何?无论你是在家中、思念家乡,还是身处异国他乡,理工科学生都不容错过一些神奇的资源网站。这些网站提供了丰富的学术资料、实验数据和技术文档,能够帮助你在假期中高效学习和提升专业技能。 ... [详细]
author-avatar
手机用户2602929101
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有