双非本科准备秋招(14.1)—— 力扣刷题

今天做两个有点难度的题。

1、295. 数据流的中位数

手写堆实现:

        加入元素:

        如何维护一个中位数?我们考虑一下堆的特点,大顶堆堆顶是一个最大值,小顶堆堆顶是一个最小值,那么,如果我们可以把数据流的数据按顺序地平均地存放在两个堆中,一个大顶堆,一个小顶堆,那么大顶堆和小顶堆的堆顶不就是中位数吗?

        就像下图这样,我们依次加入数据流,最后需要形成这样的堆。

        还需要考虑一个问题,我们怎样加入元素?肯定是加一下大顶堆,再加一下小顶堆,这样依次加入元素,但是能直接就加吗?

        不可以的,因为我们的大顶堆需要存储小的那部分元素,小顶堆需要存储大的那部分元素。

        这里需要一个巧妙地操作,比如我们每次要往大顶堆添加元素,先把这个元素加到小顶堆,然后把小顶堆的堆顶加到大顶堆中。

        比如,此时来了个100,两个堆size相同,我们想加到大顶堆中

但是100很大,所以我们先加入小顶堆,然后小顶堆堆顶移到大顶堆

这样就实现了元素加入大顶堆并且大小有序。

加入代码如下:h1大顶堆,h2小顶堆。

        if(h1.size == h2.size){h2.offer(num);h1.offer(h2.poll());}else{h1.offer(num);h2.offer(h1.poll());}

        返回答案

          如果元素相同,返回堆头之和除以2;如果不同,那肯定是大顶堆h1多一个元素,直接返回就行。注意结果是double类型。

        if(h1.size == h2.size){return (h1.peek() + h2.peek())/2.0;}return 1.0*h1.peek();

这里我手写一下堆,复习一下堆的基本写法。

 h1 = new Heap(10, true);
 h2 = new Heap(10, false);

第二个参数是true代表大顶堆,是false代表小顶堆,我将大小顶堆代码合并了。

class MedianFinder {Heap h1 = null;Heap h2 = null;public MedianFinder() {h1 = new Heap(10, true);h2 = new Heap(10, false);}public void addNum(int num) {if(h1.size == h2.size){h2.offer(num);h1.offer(h2.poll());}else{h1.offer(num);h2.offer(h1.poll());}}public double findMedian() {if(h1.size == h2.size){return (h1.peek() + h2.peek())/2.0;}return 1.0*h1.peek();}
}
class Heap{private int[] array;int size;Boolean m;public Heap(int capacity, Boolean m) {this.array = new int[capacity];this.m = m;}public int peek(){return size==0 ? -999 : array[0];}public void offer(int offered){if(size == array.length) {resize();}up(offered);size++;}private void resize() {int capacity = size + (size>>1);int[] newArr = new int[capacity];System.arraycopy(array, 0, newArr, 0, size);array = newArr;}private void up(int offered) {int child = size;while(child > 0){int parent = (child - 1) / 2;if(m ? offered > array[parent] : offered < array[parent]){array[child] = array[parent];}else {break;}child = parent;}array[child] = offered;}public int poll(){int top = array[0];swap(0, size-1);size--;down(0);return top;}private void down(int i) {int lc = 2*i+1;int rc = lc+1;int now = i;if(lc < size && (m ? array[lc] > array[now] : array[lc] < array[now])){now = lc;}if(rc < size && (m ? array[rc] > array[now] : array[rc] < array[now])){now = rc;}if(now != i){swap(now, i);down(now);}}private void swap(int top, int bottom) {int t = array[top];array[top] = array[bottom];array[bottom] = t;}
}

利用优先队列:

优先队列底层就是堆嘛,所以直接用java提供的优先队列也行。( •̀ ω •́ )y

class MedianFinder {PriorityQueue<Integer> q1;PriorityQueue<Integer> q2;public MedianFinder() {q1 = new PriorityQueue<>((o1, o2)->o2-o1);q2 = new PriorityQueue<>();}public void addNum(int num) {if(q1.size() == q2.size()){q2.offer(num);q1.offer(q2.poll());}else{q1.offer(num);q2.offer(q1.poll());}}public double findMedian() {return (q1.size()==q2.size() ? 1.0*(q1.peek()+q2.peek())/2 :1.0*q1.peek());}
}

2、239. 滑动窗口最大值

        第一想法,直接来个优先队列,但是想想不对,因为优先队列会将窗口中的数据排序,排完序之后窗口继续移动,那我就无法知道应该pop掉哪个元素了。

        我们需要一个数据结构,这个数据结构和队列很像,它能push加入队尾,pop删除队头,getMaxValue获取最大值。但是并没有这种现成的数据结构。

        实现上面需求的数据结构叫做单调队列

        单调队列中存着窗口中的元素,队列头就是当前窗口最大值,为什么能是最大值呢?因为这个队列并不是存储所有的元素,而是有选择的存,单调队列每次新加元素时,都会比较与队尾的值,如果队尾小,就一直pop,直到能添加进去,所以,如果此时新加的元素是最大值,那么它会pop掉所有队元素,成为队头。

        所以,想要在单调队列中存活,需要满足两个条件:

  • 在窗口的范围内
  • 没有被新来的元素干掉,也就是不比新来的元素小

        java中,我使用LinkedList,LinkedList实现了双端队列接口,用双端队列来模拟单调队列。

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {LinkedList<Integer> list = new LinkedList<>();//nums.length-k+1int len = nums.length;int[] ans = new int[len-k+1];int cnt = 0;for(int i = 0; i < len; i++){//弹出过时的while(!list.isEmpty() && list.peek() < i-k+1){list.poll();}//弹出末尾不够大的while(!list.isEmpty() && nums[list.peekLast()] < nums[i]){list.pollLast();}list.offer(i);if(i >= k-1){ans[cnt++] = nums[list.peek()];}}return ans;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/447951.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

路由重定向和别名

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. 路由重定向实例场景&#xff1a;路由重定向的应用场景&#xff1a; 2. 路由别名实例场景&#xff1a;路由别名的应用场景&#xff1a; ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&…

【INTEL(ALTERA)】为什么 F-tile Serial Lite IV FPGA IP 设计示例会失败

说明 由于Intel Agilex 7 FPGA I 系列收发器-SoC 开发套件的时钟控制器 GUI 存在问题&#xff0c;当您需要配置芯片 Si5332 的 OUT1 时钟频率时&#xff0c;您可能会发现 F-tile Serial Lite IV 英特尔 FPGA IP设计示例失败。这是因为此 Si5332 GUI 存在问题;无法准确配置 OUT…

Python使用fastAPI实现一个流式传输接口

1. 使用fastapi实现流式传输 1.1 服务端 fastapi_server.py 编写服务端代码fastapi_server.py。服务端代码主要使用了fastapi和uvicorn两个库。 #!/usr/bin/env python # codingutf-8 # Time : 2024/1/31 19:13 # Software: PyCharm from fastapi import FastAPI from fa…

【JavaScript】var,let 和 const 的区别

先看一些前置知识&#xff1a; 此时输出 undefined。 全局作用域&#xff1a;全局都可以访问。函数作用域&#xff1a;只有函数内部可以访问。块级作用域&#xff1a;let 和 const 只能在块级作用域&#xff08;一对大括号包裹的代码片段&#xff09;中访问。let 和 const 在变…

怎么把图片的二维码提取出来?免费在线二维码转换成链接的方法

在部分情况下无法直接使用二维码展示内容&#xff0c;那么可以将二维码分解成链接后来使用&#xff0c;点击链接就可以跳转二维码的页面内容&#xff0c;这种方式可以在电脑或者手机上预览二维码内容。怎么提取二维码链接呢&#xff1f;下面小编来教大家二维码解码器的使用方法…

单机搭建hadoop环境(包括hdfs、yarn、hive)

单机可以搭建伪分布式hadoop环境&#xff0c;用来测试和开发使用&#xff0c;hadoop包括&#xff1a; hdfs服务器 yarn服务器&#xff0c;yarn的前提是hdfs服务器&#xff0c; 在前面两个的基础上&#xff0c;课可以搭建hive服务器&#xff0c;不过hive不属于hadoop的必须部…

Linux自动创建本地yum源与清华大学源仓库

Linux自动创建本地yum源与清华大学源仓库 系统环境&#xff1a; Server1&#xff1a;172.20.26.167—CentOS7.6 在172.20.26.167服务器上 yum install yum-utils -y 输入yum按两下tab键&#xff0c;可以看到 yum-config-manager 工具&#xff0c;使用该工具可以自动配置仓…

【正点原子STM32连载】第四十六章 SD卡实验 摘自【正点原子】APM32E103最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32E103最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四…

异步编程,到底有什么用?

关键词&#xff1a;高性能、架构设计、异步思想、场景落地 文章导读 场景切入 先来看一个日常生活快递寄件场景&#xff0c;从寄件人&#xff08;寄件&#xff09;到收件人&#xff08;收件&#xff09;&#xff0c;全流程如下 当你准备寄送一个包裹时&#xff0c;通常你可以…

Qt|制作简单的不规则窗体

通常我们用到的对话框基本上都是规则的&#xff0c;在有些特殊情况下&#xff0c;也会使用到不规则窗口&#xff0c;那么该如何实现不规则窗体呢&#xff1f; 在MFC框架下很难实现&#xff0c;应该说是难的都想放弃&#xff0c;但是&#xff0c;Qt框架下提供了一个叫做setMask…

Python+PyQt5+C Hw信息检测

UI主界面&#xff1a; C源代码&#xff1a; /* I/O port access* Copyright (C) 2009 Red Hat Inc.** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Fo…

kingbase控制文件重建

背景&#xff1a; 测试版本&#xff1a;V008R006C005B0023 sys_control文件在数据目录的global下 若sys_control文件损坏或被删&#xff0c;会导致库无法启动 处理方式&#xff1a; 所在目录为数据目录 1、尝试dryrun touch global/sys_control sys_resetwal -l 00000001…