剑指Offer——数据流中的中位数(JS实现) |刷题打卡

简介: 剑指Offer——数据流中的中位数(JS实现) |刷题打卡

前言

掘金团队号上线,助你 Offer 临门! 点击 查看详情

题目描述

image.png

解题思路

  • 这道题属于考查二分查找
  • 本题如果直接采用JS中自带的排序肯定是要超时的,要不然LeetCode也不会将这道题归为困难
  • 二分查找的思路定义两个指针,一个指针指向的是数组元素的第一个下标,另一个指针指向的是数组元素的最后一个元素的下标。
  • 中位数下标指的是通过四舍五入的方法,左边指针的下标 + 右边指针的下标 / 2然后进行四舍五入,得到的就是中位数下标
  • 如果要添加的值大于中位数下标对应的值,左边的指针移动到中位数指针+1的位置。如果要添加的值小于中位数下标对应的值,右边的指针移动到中位数指针-1的位置,如果相等则直接添加导致中位数下标的位置,其余元素后移。
  • 循环的结束条件是左指针>右指针

解题代码

var MedianFinder = function() {
    this.stack = [];
};
MedianFinder.prototype.addNum = function(num) {
    if (this.stack.length === 0) {
       this.stack.push(num);
       return; 
    }
    // 定义左指针和右指针 注意:这里的指针指的都是下标
    let left = 0;
    let right = this.stack.length - 1;
    while (left <= right) {
        // 找到中位数的下标
        let mid = Math.floor((left + right)/2);
        if (num === this.stack[mid]) {
            this.stack.splice(mid,0,num);
            return;
        } else if (num < this.stack[mid]) {
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    this.stack.splice(right+1,0,num);
};
MedianFinder.prototype.findMedian = function() {
    if (this.stack.length === 0) {
        return [];
    }
    if (this.stack.length % 2 === 0) {
        let len = this.stack.length;
        return (this.stack[len/2] + this.stack[len/2 -1]) / 2
    } else {
        let mid = Math.floor(this.stack.length/2);
        return this.stack[mid];
    }
};

总结(本题给我们的启示思路)

  • 启示一:学会使用二分查找
  • 启示二:学会使用splice插入元素
  • 启示三:通过Math.floor进行四舍五入来求中位数下标
相关文章
|
存储 JavaScript 前端开发
js数据流详细讲解
【6月更文挑战第3天】这篇内容介绍了JavaScript中的数据流概念,包括单向和双向数据流模式。单向数据流是从父组件到子组件的单向传递,不直接修改数据;双向数据流允许父组件和子组件间数据同步更新。此外,文中还提到了状态管理(如Redux)、异步数据流处理、数据转换和实时数据流(WebSocket)等扩展话题,这些都是理解和优化JavaScript应用数据流的关键。
210 1
|
10月前
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
存储 JSON JavaScript
「offer来了」保姆级巩固你的js知识体系(4.0w字)
该文章提供了JavaScript知识体系的全面复习资料,覆盖了从基础语法到高级特性如闭包、原型链、异步编程等多个方面,并通过大量的面试题和实例代码帮助巩固理解。
「offer来了」保姆级巩固你的js知识体系(4.0w字)
|
消息中间件 JavaScript 前端开发
用于全栈数据流的 JavaScript、Node.js 和 Apache Kafka
用于全栈数据流的 JavaScript、Node.js 和 Apache Kafka
243 1
|
消息中间件 存储 JavaScript
构建一个基于Node.js的实时数据流处理系统
【5月更文挑战第30天】使用Node.js构建实时数据流处理系统,结合WebSocket实现双向通信,Kafka作为消息队列,Redis做数据存储和缓存,D3.js用于数据可视化。系统包括数据源、传输、处理、存储和可视化五个关键部分,适合高并发、低延迟的实时监控与分析需求。
|
JavaScript Java 测试技术
基于微信小程序的刷题系统的+springboot+vue.js附带文章和源代码设计说明文档ppt
基于微信小程序的刷题系统的+springboot+vue.js附带文章和源代码设计说明文档ppt
285 1
|
JavaScript 前端开发
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
|
JavaScript 前端开发
JavaScript题解剑指offer : 09. 用两个栈实现队列
JavaScript题解剑指offer : 09. 用两个栈实现队列
116 0
|
JavaScript 前端开发
刷题日常计~JS⑥
刷题日常计~JS⑥
刷题日常计~JS⑥
|
存储 JavaScript 前端开发
刷题日常计~JS⑤
刷题日常计~JS⑤
刷题日常计~JS⑤

热门文章

最新文章