一个真正的鳗,他清楚自己每天都要刷《剑指offer》(第九天)

news2024/11/20 3:19:30

跟着博主一起刷题
这里使用的是题库:
https://leetcode.cn/problem-list/xb9nqhhg/?page=1这里是引用

目录

    • 剑指 Offer 57 - II. 和为s的连续正数序列
    • 剑指 Offer 59 - I. 滑动窗口的最大值
    • 剑指 Offer 60. n个骰子的点数

剑指 Offer 57 - II. 和为s的连续正数序列

剑指 Offer 57 - II. 和为s的连续正数序列
这道题我的想法是利用两个指针,p1=1,p2=2,两个指针的值相加除2再乘以差值和target比较,根据大于?小于?还是等于来进行p1,p2的更新。

class Solution {
    public int[][] findContinuousSequence(int target) {
        int p1=1,p2=2;
        List<List<Integer>> list=new ArrayList<>();
        while(p2<=target/2+1){
            if(1.0*(p2-p1+1)*(p1+p2)/2>target){
                p1++;
            }else if(1.0*(p2-p1+1)*(p1+p2)/2<target){
                p2++;
            }else{
                List<Integer> line=new ArrayList<>();
                for(int i=p1;i<=p2;i++){
                    line.add(i);
                }
                list.add(line);
                p1++;
            }
        }
        int[][] ret=new int[list.size()][];
        for(int i=0;i<list.size();i++){
            int[] nums=new int[list.get(i).size()];
            for(int j=0;j<nums.length;j++){
                nums[j]=list.get(i).get(j);
            }
            ret[i]=nums;
        }
        return  ret;
    }
}

剑指 Offer 59 - I. 滑动窗口的最大值

剑指 Offer 59 - I. 滑动窗口的最大值
一般的思路是每滑动一次,就遍历一遍窗口内的值,找出最大。
但是这样的时间复杂度很高,是O(n*k),显然不是我们想看到的。那么怎么一次遍历就球场结果呢?
我们发现,第一种方式下,每一次求出的最大值可能再下一次滑动中还是最大值,但是我们却没有利用上,那么怎么利用上这个值呢?
我们利用一个队列queue,如图:
在这里插入图片描述

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        Deque<Integer> queue=new ArrayDeque<>();//记录元素
        Deque<Integer> index=new ArrayDeque<>();//记录下标
        //结果数组长度=数组长度-k+1
        int[] result=new int[nums.length-k+1];
        int left=0,right=0;
        int i=0;
        while(right<=nums.length){
            if(right>=k){//初始化窗口和队列后进入
                //把小于窗口左边界left的都弹出
                while(index.peekFirst()<left){
                    index.pollFirst();
                    queue.pollFirst();
                }
                result[i++]=queue.peekFirst();
                left++;
            }
            if(right==nums.length)break;
            while(!queue.isEmpty()&&nums[right]>=queue.peekLast()){//按插入排序找插入位置
                queue.pollLast();
                index.pollLast();
            }
            queue.offer(nums[right]);
            index.offer(right);
            right++;
        }
        return result;
    }
}

那么看了官方题解后,发现我们的记录数组元素queue多余的,我们只需要一个记录数组下标的queue进行了,可以剩一部分空间。
不过,这种思想的时间复杂度就缩短到了O(N)
改进后:

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        Deque<Integer> index=new ArrayDeque<>();//记录下标
        //结果数组长度=数组长度-k+1
        int[] result=new int[nums.length-k+1];
        int left=0,right=0;
        int i=0;
        while(right<=nums.length){
            if(right>=k){//初始化窗口和队列后进入
                //把小于窗口左边界left的都弹出
                while(index.peekFirst()<left){
                    index.pollFirst();
                }
                result[i++]=nums[index.peekFirst()];
                left++;
            }
            if(right==nums.length)break;
            while(!index.isEmpty()&&nums[right]>=nums[index.peekLast()]){//按插入排序找插入位置
                index.pollLast();
            }
            index.offer(right);
            right++;
        }
        return result;
    }
}

只保留index即可

剑指 Offer 60. n个骰子的点数

剑指 Offer 60. n个骰子的点数
我一开始采用暴力求解的方法,即判断每一个筛子投的大小,记录结果。但是这样的时间复杂度太高了,当n==11时,发生来了时间超限。代码如下:

class Solution {  
    private List<Integer> list; 
    private Map<Integer,Integer> map;
    private int total=0;
    public double[] dicesProbability(int n) {
        list=new ArrayList<>();
        map=new HashMap<>();
        rank(n,0);
        double[]  result=new double[list.size()];
        //对list进行排序
        Collections.sort(list);
        for(int i=0;i<result.length;i++){
            result[i]=1.0*map.get(list.get(i))/total;
        }
        return result;
    }

    private void rank(int n,int val){
        if(n==0){//抛完了
        total+=1;
            if(map.containsKey(val)){
                map.put(val,map.get(val)+1);
            }else{
                map.put(val,1);
                list.add(val);
            }
            return;
        }
        //抛出1
        rank(n-1,val+1);
        //抛出2
        rank(n-1,val+2);
        //抛出3
        rank(n-1,val+3);
        //抛出4
        rank(n-1,val+4);
        //抛出5
        rank(n-1,val+5);
        //抛出6
        rank(n-1,val+6);
    }
}

观察发现,抛出n个筛子得到的某个和x,从一定程度上取决余n-1个筛子的结果。也就是:
f(n,x)=f(n-1,x-1)(1/6)+f(n-1,x-2)(1/6)+…+f(n-1,x-6)*(1/6);
这样就得到了递推公式:
在这里插入图片描述
把这个递推公式反过来,我们就可以通过f(1)开始计算f(2),一直计算到f(n)为止,也就是:
在这里插入图片描述

public double[] dicesProbability(int n) {
        double[] result=new double[6];
        Arrays.fill(result,1.0/6);
        for(int i=2;i<=n;i++){
            double[] tmp=new double[5*i+1];
            for(int j=0;j<result.length;j++){
                for(int k=0;k<6;k++){
                    tmp[k+j]+=result[j]*(1.0/6);
                }
            }
            result=tmp;//两个数组交替使用
        }
        return result;
    }

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

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

相关文章

文旅元宇宙热潮来袭,天下秀用“科技之钥”解锁三大价值

让未来照进现实&#xff0c;让现实走进虚拟&#xff0c;元宇宙正成为通往下个时代的船票。2018年上映的电影《头号玩家》&#xff0c;让大部分人首次感触到元宇宙里的沉浸式体验——男主角带上VR头盔后&#xff0c;瞬间就能进入另一个极其逼真的虚拟世界。随着VR、AR、区块链、…

系统回顾MyBatis体验这一优秀的持久层框架

文章目录1.MyBatis2.Mapper代理3.MyBatis配置升级4.配置文件CRUD5.多条件查询6.多条件动态查询7.单条件动态条件查询8.添加数据并主键返回9.更新数据10.删除数据11.参数传递12.注解开发1.MyBatis MyBatis基本上取消了所有的JDBC硬编码&#xff0c;对于单独使用这样的ORM框架&a…

1585_AURIX_TC275_SMU的部分内核寄存器

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 继续看SMU的资料&#xff0c;这次看一部分SMU的内核相关寄存器。这一次整理的内容比较少&#xff0c;而且优点断篇&#xff0c;因此按照序号来分没有保持10页的对齐。 调试相关的寄存器不…

详解外网访问内网DDNS作用 及ddns解析软件使用方法

导语&#xff1a;随着互联网的成熟&#xff0c;家庭宽带的提速&#xff0c;大家对外网访问家庭内网电脑&#xff0c;监控&#xff0c;服务器&#xff0c;存储NAS等设备的需求倍增。目前外网访问内网可以用DDNS动态域名解析的方式&#xff0c;以下本文就来介绍一下原理和实现工具…

ELK日志(3)

EFK日志收集 Elasticsearch: 数据库&#xff0c;存储数据 javalogstash: 日志收集&#xff0c;过滤数据 javakibana: 分析&#xff0c;过滤&#xff0c;展示 javafilebeat: 收集日志&#xff0c;传输到ES或logstash go redis&#xff1a;缓冲数据&#xff0c;等待logstash取数据…

高并发多级缓存架构解决方案 OpenResty、canal搭建及使用流程

高并发多级缓存架构解决方案1、缓存的常规使用方式2、请求流程拆分1、搭建tomcat集群2、搭建OpenRestyOpenResty的目录结构nginx的配置文件lua脚本的执行流程http请求反向代理到tomcat服务器3、OpenResty、Redis的单点故障问题4、防止缓存穿透java中通过redisson实现布隆过滤器…

Mac 下配置 go语言环境

Mac 下配置 go语言环境两种方法安装Go通过Homebrew安装&#xff08;不太推荐&#xff09;通过官网安装 &#xff08;推荐&#xff09;方法一安装Homebrew通过Homebrew安装Go方法二 通过官网进行安装配置go环境配置go环境国内镜像Vscode环境配置Helloworld.go两种方法安装Go 通…

LabVIEW中的VI脚本

LabVIEW中的VI脚本用户可使用VI脚本选板上的VI、函数和相关的属性、方法&#xff0c;通过程序创建、编辑和运行VI。通过VI脚本&#xff0c;可减少重复的VI编辑所需的时间&#xff0c;例如&#xff1a;创建若干类似VI对齐和分布控件显示或隐藏控件标签连接程序框图对象注: 必须先…

【13】Docker_DockerFile | 关键字

目录 1、DockerFile的定义 2、DockerFile内容基本知识 3、Docker执行DockerFile的大致流程 4、DockerFile的关键字 5、举例&#xff1a; 1、DockerFile的定义 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 2、Do…

[前端笔记——HTML介绍] 2.开始学习HTML

[前端笔记——HTML介绍] 2.开始学习HTML1什么是HTML&#xff1f;2剖析一个HTML元素3块级元素和内联元素4空元素5属性6为一个元素添加属性7布尔属性8省略包围属性值的引号9单引号或双引号?10剖析HTML文档11实体引用&#xff1a;在 HTML 中包含特殊字符1什么是HTML&#xff1f; …

LeetCode 17. 电话号码的字母组合

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 17. 电话号码的字母组合&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 17.…

文件操作中的IO流——字节流与字符流

一&#xff0c;IO流1.什么是IO流IO流是存取和读取数据的解决方案2.IO流的作用IO流用于读写数据&#xff0c;这些数据包括本地文件和网络上的一些数据&#xff1b;比如读写本地文件的时候需要用到文件读写的IO流&#xff0c;读写网络上的数据时需要通过Socket套接字来调用数据流…

机器学习:公式推导与代码实现-监督学习单模型

线性回归 线性回归(linear regression)是线性模型的一种典型方法。 回归分析不再局限于线性回归这一具体模型和算法,更包含了广泛的由自变量到因变量的机器学习建模思想。 原理推导 线性回归学习的关键问题在于确定参数w和b,使得拟合输出y与真实输出yi尽可能接近 为了求…

PowerDesigner16.5配置安装与使用

PowerDesigner16.5百度云下载链接 链接&#xff1a;https://pan.baidu.com/s/1b9XUqxVZ8gTqk_9grptcAQ?pwd3pl7 提取码&#xff1a;3pl7 一&#xff1a;软件安装 1.下载安装包&#xff08;包含安装文件、汉化包、注册文件&#xff09; 2.下载后文件内容如下 3.进入安装文件中…

5. 统计学基础1:平均值...四分位数、方差、标准差(均方差)、标准误(标准误差、均方根误差)、 标准分

文章目录1. 平均值、中位数、众数、极差、四分位数&#xff08;即下、中、上四份位数&#xff09;2. 方差&#xff08;Var、D(X) 、σ^2^&#xff09;、标准差【也叫均方差】&#xff08;SD 、σ&#xff09;3. 标准误【也叫标准误差、均方根误差】&#xff08;SE&#xff09;4…

高空探测数据处理--对流层顶选取

对流层的概念(维基百科) 对流层(英语:Troposphere)是地球大气层中最靠近地面的一层,也是地球大气层里密度最高的一层。它蕴含了整个大气层约75%的质量,以及几乎所有的水蒸气及气溶胶。 对流层从地球表面开始向高空伸展,直至对流层顶,即平流层的起点为止。对流层的上…

【Labview】每日一题

&#x1f6a9;write in front&#x1f6a9; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021年度博客之星物联网与嵌入式开发TOP5&#xff5…

The ATIS Spoken Language Systems Pilot Corpus

摘要 语音研究有巨大的进步在过去使用以下的模式: 定义研究问题收集语料针对性的衡量进展解决这个研究问题 自然语言研究&#xff0c;另一方面&#xff0c;取得了典型的进步在没有任何数据语料的情况下&#xff0c;这能够测试研究的假设。 我们描述了ATISATISATIS试点语料库…

从C到C++及类与对象

目录 从C到C 嵌入式领域常用的GUI 语法的升级 引用 默认参数 函数重载 堆内存 概念和思维的升级 类和对象 类的申明 类的成员函数 常成员、常对象&#xff08;C推荐const而不用#define&#xff0c; mutable &#xff09; 静态成员(属于类不属于对象) 友元(破坏…

Opencv实战案例——模板匹配实现银行卡号识别(附详细介绍及完整代码下载地址)

Opencv目录1.项目意义2.模板匹配3.图像二值化3.1全局阈值3.2全局阈值代码即效果展示3.3 自适应阈值3.4自适应阈值代码即效果展示4.轮廓筛选4.1轮廓检测4.2绘制轮廓4.3轮廓筛选代码及效果展示5.形态学变化5.1腐蚀5.2膨胀5.3开运算和闭运算、礼帽和黑帽6.项目实战6.1读取图片转化…