48数据流中的中位数 49表达式 50两数之和

news2024/10/6 16:18:54

48数据流中的中位数

在这里插入图片描述
第一次没看到要求排序,还以为题目答案写错了,用排序的内置函数也正好是nlogn

import java.util.ArrayList;

public class Solution {
    ArrayList<Integer> list = new ArrayList<>();
    
    public void Insert(Integer num) {
        list.add(num);   
    }

    public Double GetMedian() {
        ArrayList<Integer> list2 = (ArrayList<Integer>)list.clone();
        list2.sort((a,b)->a-b);
        int length=list.size();

        if(length%2==1){//奇数
            return list2.get((length-1)/2).doubleValue();
        }
        else{
            return (list2.get(length/2).doubleValue()+list2.get(length/2-1).doubleValue())/2;
        }
        
    }

}

Integer转换为Double:
list2.get((length-1)/2).doubleValue();

法二,用插入排序

因为每次都是增加一个元素,不如直接维护原来的有序数组,这样每次插入的时间复杂度为O(N), GetMedian的时间复杂度为O(1),空间复杂度为O(n)

import java.util.*;

public class Solution {
    private ArrayList<Integer> list = new ArrayList<Integer>();

    public void Insert(Integer num) {
        int i=0;
        for( i=0;i<list.size();i++){
            if(list.get(i)>num) break;//找到第一个大于它的,插入
        }
        list.add(i,num);
    
    }

    public Double GetMedian() {
        int length=list.size();

        if(length%2==1){//奇数
            return list.get((length-1)/2).doubleValue();
        }
        else{
            return (list.get(length/2).doubleValue()+list.get(length/2-1).doubleValue())/2;
        }
        
    }


}

list(index i, E element)可以向指定索引插入元素,后面的自动后移

法3,优先队列

维护两个优先队列,一个最大堆存数组中最小的一半元素,一个最小堆存数组中最大的一半元素,如果是偶数就两个堆顶取平均。
我觉得最难的在于维护这两个堆,保证两个堆的元素刚好分别是最大的一半和最小的一半:

  • 元素先进入最大堆(存小数)
  • 然后取最大堆的top一一进入最小堆(存大数)
  • 如果最大堆的元素个数<最小堆的元素个数,将最小堆的top给最大堆

这样能保证最大堆的元素个数>=最大堆的

import java.util.*;

public class Solution {
    private PriorityQueue<Integer> max = new PriorityQueue<Integer>((a,b)->b-a);
    private PriorityQueue<Integer> min = new PriorityQueue<Integer>((a,b)->a-b);

    public void Insert(Integer num) {
       max.offer(num);
       min.offer(max.poll());
       if(max.size()<min.size()){
           max.offer(min.poll());
       }
    
    }

    public Double GetMedian() {
        int maxsize=max.size();
        int minsize=min.size();

        if(maxsize==minsize){//奇数
            return ((double)max.peek()+(double)min.peek())/2;
        }
        else{
            return (double)max.peek();
        }
        
    }


}

插入的时间复杂度降为了logn,getMedian为O(1)

49表达式求值

在这里插入图片描述

写起来还是很麻烦,主要是判断求值的两种情况:

  • 遇到)
  • 当前符号的优先级<=符号栈顶的优先级

总体来说分为四种情况:

  1. 遇到(直接入op栈
  2. 遇到数字要计算连续数字的值,记得最后i要减1,因为大循环也+1
  3. )可以计算
  4. ±*需要判断当前符号和栈顶的优先级,当前符号的优先级<=的时候可以计算
    注意计算的时候要while.因为可能存在多个符号需要计算
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    Map<Character,Integer> map=new HashMap<Character,Integer>(){{
        put('-',1);
        put('+',1);
        put('*',2);
    }};

    public int solve (String s) {
        // write code here
        Stack<Integer> num = new Stack<>();
        Stack<Character> op = new Stack<>();
        num.push(0);//防止第一个是负数;
        for(int i=0;i<s.length();i++){
            //字符
            if(!Character.isDigit(s.charAt(i))){
                if(s.charAt(i)=='(') op.push('(');
                else if(s.charAt(i)==')'){
                    while(op.peek()!='('){//里面可能需要多次计算
                        cal(num,op);
                    }
                    op.pop();//去掉(             
                }else{//+-*
                    while(!op.isEmpty()&& op.peek()!='('){//里面可能需要多次计算
                        if(map.get(s.charAt(i))<=map.get(op.peek()))
                            cal(num,op);
                        else break;
                    }
                    op.push(s.charAt(i));
                }

            }else{//数字
                int num1 = 0;
                while(i<s.length()&&Character.isDigit(s.charAt(i))){
                    num1=num1*10+s.charAt(i)-'0';
                    i++;
                }
                //因为大循环再加一次
                i--;
                num.push(num1);
            }
        }
        while (!op.isEmpty() && op.peek() != '(') cal(num, op);//把剩下的算完
        return num.pop();
    }

    public void cal(Stack<Integer> num, Stack<Character> op){
        int right = num.pop();
        int left = num.pop();
        int res=0;
        switch(op.pop()){
            case '+': 
                res = left+right;
                break;
            case '-': 
                res = left-right;
                break;
            case '*': 
                res = left*right;
                break;
        }
        num.push(res);
    }
}

时间和空间复杂度都是O(n)

50 两数之和

在这里插入图片描述
这题印象很深刻,用哈希表存target出现过的数和对应的索引即可,时间和空间复杂度都是O(n)

import java.util.*;


public class Solution {
    /**
     * 
     * @param numbers int整型一维数组 
     * @param target int整型 
     * @return int整型一维数组
     */
    public int[] twoSum (int[] numbers, int target) {
        // write code here
        Map<Integer,Integer> m = new HashMap<>();//存值和index
        int[] res = new int[2];
        for(int i=0;i<numbers.length;i++){
            if(m.containsKey(numbers[i])){
                res[0] = m.get(numbers[i]);
                res[1] = i+1;
                break;
            }else{
                m.put(target-numbers[i],i+1);
            }
        }
        return res;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小满nestjs(第二十七章 nestjs typeOrm关系)

在我们开始的过程中&#xff0c;肯定不会把数据存在一个表里面&#xff0c;我们会进行分表&#xff0c;把数据分开存&#xff0c;然后通过关联关系&#xff0c;联合查询。 typeOrm 文档 一对一 | TypeORM 中文文档 前端代码还是复用上一章的 增加了一个添加Tag <template…

腾讯安全联合发布《2022游戏安全白皮书》:外挂对抗仍然激烈

2022年以来&#xff0c;各类游戏安全事件的发生给不断影响着游戏生态的健康发展。同时&#xff0c;随着游戏行业数字化进程的加快&#xff0c;以及游戏全球化布局的不断推进&#xff0c;游戏厂商对于游戏安全的投入越来越大&#xff0c;掌握最新的行业安全态势有利于其安全防护…

外汇天眼:WiKiEXPO亮相香港亚洲博览馆,史上最强大咖阵容坐镇

凛冬已至&#xff0c;在这个寒冷的冬天&#xff0c;WikiGlobal将于2022年12月16日至17日早9:00--晚18:00在香港的亚洲国际博览馆举办为期两天的“Wiki Finance EXPO Asia 2022”。目前展会已拉开帷幕。  此次展会展厅面积高达5000多平方米&#xff0c;经过WiKiEXPO科学的规划和…

【数据结构】线性表之单链表

目录 一、链表的概念 1、概念 2、分类 3、重点 二、单链表模拟实现 1、准备 2、头插法 3、尾插法 4、指定下标插入 5、遍历 6、删除第一次出现的元素key 7、删除所有的key 8、双指针删除所有的key 一、链表的概念 1、概念 是一种物理存储结构上非连续的存储结构&a…

PS-历史记录

目录 哪里能找到【历史记录】面板 1、窗口→历史记录 2、编辑→清理→历史记录 还原 1、点击【历史记录】面板 快捷键 【ctrlz】 【shiftctrlz】 从当前状态创建新文档 创建新快照 给快照起名 1、右击你要创建快照的步骤 2、点击面板菜单 3、先按住alt不动&#…

Java 对象和类

Java作为一种面向对象语言。支持以下基本概念&#xff1a; 多态继承封装抽象类对象实例方法重载 本节我们重点研究对象和类的概念。 对象&#xff1a;对象是类的一个实例&#xff08;对象不是找个女朋友&#xff09;&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对…

猿如意|chat GPT测评

文章目录猿如意猿如意传送门猿如意个人使用感受好的一面&#xff1a;可以改进的一面:什么是猿如意chat GPT测评chat GPT使用过程使用场景描述&#xff1a;问题1问题2问题3问题4&#xff1a;问题5&#xff1a;主观感受&#xff1a;认为此功能不足的地方&#xff1a;对此功能的期…

学习编程的过程中可能会走哪些弯路,有哪些经验可以参考?

很多人学习编程, 走的弯路可以总结为以下几点: 一言不合找视频&#xff0c;几十集视频刷半年。 很多人学习编程的时候&#xff0c;喜欢看视频学&#xff0c;我这里总结一下看视频学习编程的弊端。 1. 完善的视频资源往往稍稍过时&#xff0c;比如你会发现很多java的教学视频…

产品设计市场调研有哪些特点?

产品市场种类繁多&#xff0c;变化无常&#xff0c;消费者需求各异。在工业设计之初&#xff0c;需要对行业和区域环境进行调查分析&#xff0c;深入了解市场情况、市场供求关系、客户引导、趋势等&#xff0c;客观合理地对新产品进行适当定位。只有有了正确的新产品概念规划方…

三方接口签名验签简易设计与实现

本人水平有限&#xff0c;对密码学的理解相当浅显。错误与疏漏&#xff0c;欢迎各位指正。 〇、写在前面 接口安全防护是个永恒的话题&#xff0c;提供给前端的接口需要登录&#xff0c;提供给服务的接口(下文简称"三方接口")也需要鉴权&#xff1b;当前大环境下,ht…

chatgpt教我内存对齐,对齐了但没完全对齐?

文章目录内存对齐关于chatgpt的回答总结内存对齐 关于chatgpt的回答 我与chatgpt的对话如下&#xff1a; 我现在来描述与总结上述对话都干了啥以及我为什么要问这个。 我本来是在学习rapidjson源码里面的内存池实现&#xff0c;然后 RAPIDJSON_ALIGN 没有看懂&#xff0c;所…

JSP课设:家庭相册管理系统(附源码+调试)

JSP家庭相册管理系统 &#xff08;1&#xff09;登录模块&#xff1a;分为普通用户和管理员两种角色&#xff1b; &#xff08;2&#xff09;普通用户模块&#xff1a;相册管理&#xff1a;用户可以对自己相册进行编辑&#xff0c;可以进行批量删除相册、新增相册、编辑相册以…

【Golang】案例为基浅谈Go的变量与常量

&#x1f4d3;推荐网站(不断完善中)&#xff1a;个人博客 &#x1f4cc;个人主页&#xff1a;个人主页 &#x1f449;相关专栏&#xff1a;CSDN专栏、个人专栏 &#x1f3dd;立志赚钱&#xff0c;干活想躺&#xff0c;瞎分享的摸鱼工程师一枚 &#x1f352;前言 在上一篇文章中…

Python图像识别实战(三):基于OpenCV实现批量单图像超分辨重建(附源码和实现效果)

前面我介绍了可视化的一些方法以及机器学习在预测方面的应用&#xff0c;分为分类问题&#xff08;预测值是离散型&#xff09;和回归问题&#xff08;预测值是连续型&#xff09;&#xff08;具体见之前的文章&#xff09;。 从本期开始&#xff0c;我将做一个关于图像识别的…

“命悬一线”复试上岸浙大MBA的经验分享~

作为去年踩线上岸浙大MBA的幸运者&#xff0c;希望自己的一些经历和经验能够帮助到今年的考生。因为去年在联考初试准备的时间不是很充分&#xff0c;加上在职工作相对比较忙&#xff0c;真正能用到学习上时间真的不多。笔试成绩只拿到191分&#xff0c;在去年的复试考生里算是…

Qt+C++基本绘图(画线,画圆,矩形, 撤销,重做)

程序示例精选 QtC基本绘图(画线&#xff0c;圆&#xff0c;矩形画线&#xff09; 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《QtC基本绘图(画线&#xff0c;画圆&#xff0c;矩形, 撤销&am…

Redis常见面试题(四)

1、Redis有哪些淘汰策略? Redis目前有8种淘汰策略: 1&#xff09;Volatile-lru: 设置了过期时间的Key使用了LRU算法淘汰; 2&#xff09;Allkeys-lru: 所有key使用LRU算法; 3&#xff09;Volatile-lfu: 设置了过期时间的key使用了LFU算法淘汰; 4&#xff09;Allkeys-lfu: …

一文读懂页面布局

一. 前端布局 谈到浏览器页面&#xff0c;我们肯定是希望页面越美观越好&#xff0c;这样才能吸引用户点击。页面美观就自然需要用到各种布局&#xff0c;好的布局不仅能提高用户体验感留住用户&#xff0c;还能提高维护的效率。本文就列举一下常用的前端布局&#xff0c;并配上…

【MATLAB教程案例65】深度学习网络建模2,通过deepNetworkDesigner工具箱实现

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 1.软件版本 2.分类识别数据库的应用

第八章练习题-2

第七题 答案 package com.hspedu.homework.homework07;public class HomeWork07 {public static void main(String[] args) {} } class Test{ //父类String name "Rose";Test(){System.out.println("Test");}Test(String name){this.name name;} } clas…