【算法刷题】Day11

文章目录

  • 面试题 08.01. 三步问题
    • 题干:
    • 算法原理:
      • 1、状态表示
      • 2、状态转移方程
      • 3、初始化
      • 4、填表顺序
      • 5、返回值
    • 代码:
  • 209. 长度最小的子数组
    • 题干:
    • 算法原理:
      • 1、暴力枚举出所有的子数组的和
      • 2、利用单调性,使用“同向双指正”来优化
    • 代码:
  • 3. 无重复字符的最长子串
    • 题干:
    • 算法原理:
      • 1、暴力枚举 + 哈希表(判断字符是否重复出现)
      • 2、利用规律,使用“滑动窗口”来解决问题
    • 代码:

面试题 08.01. 三步问题

在这里插入图片描述
原题链接


题干:

小孩可以一次上 1阶 2阶 3阶
刚开始看题目可能不太清楚
我们画图看一看
在这里插入图片描述
如果是一节台阶,只有一种情况
如果是两节台阶,从0到1有一种,经过1到2有一种,所以是两种
如果是三节台阶,从0到3有一种,经过1到3有一种,经过2到3有一种,所以是四种
如果是四阶台阶,经过1到4有一种,经过2到4有两种,经过3到4有四种,所以一共有七种

以此类推
从第三个以后,每个台阶数都是前面的三个数之和
和前面的泰波那契数很像


算法原理:

1、状态表示

dp[i] 表示:到达 i 位置时,一共有多少种方法

2、状态转移方程

以 i 位置的状态,最近的一步,来划分问题
对于 i 来说,可以是 i - 1 走一步,i - 2 走两步,i - 3 走三步
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]

3、初始化

dq[1] = 1;
dp[2] = 2;
dp[3] = 4;

4、填表顺序

从左向右

5、返回值

dp[n]

代码:

class Solution {
    public int waysToStep(int n) {
        int MOD = (int)1e9 + 7;

        int[] dp = new int[n + 1];
        if (n == 1 || n ==2) {
            return n;
        }
        if (n == 3) {
            return 4;
        }
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 4;
        for (int i = 4; i <= n; i++) {
            dp[i] = ((dp [i - 1] + dp[i - 2]) % MOD + dp[i - 3]) % MOD;
        }
        return dp[n];
    }
}

在这里插入图片描述

209. 长度最小的子数组

在这里插入图片描述
原题链接

题干:

在题目中,正整数数组中有没有一个连续子数组等于目标值,然后返回长度(最短的)
在这里插入图片描述

算法原理:

1、暴力枚举出所有的子数组的和

直接固定第一个数,从前往后来进行加法计算
时间复杂度:O(N3)

优化一:
定义一个sum,把从前往后计算的数存到sum 中
时间复杂度:O(N2)

优化二:
在这里插入图片描述
当 right 走到sum = 8的时候,往后走,虽然和在增加,但是长度也在增加,所以后面的并不是最佳答案
并且当left++ 的时候,sum 可以直接减去left 前面那个数,right 不会变

这样我们就优化到了解法二

2、利用单调性,使用“同向双指正”来优化

同向双指针被称为“滑动窗口
在利用单调性的时候,两个指针在移动的时候都不回退,这个时候我们可以使用滑动窗口


那我们怎么使用滑动窗口呢?

  1. 初始化两个指针充当滑动窗口的左右端点
    left = 0;
    right = 0;
  2. 进窗口
  3. 判断,然后决定是否出窗口
  4. 更新结果(不过在什么时候更新结果就题论题)
    在本题中,因为要先判断 sum 是否等于目标值,先更新结果 让 len = 区间,然后再出窗口

这里的 2 和 3 是循环


为什么这里滑动窗口是对的呢?
是由于单调性的原因,在上面的一步步优化的时候就可以知道,当这个区间的和大于目标值之后,后面的值加进来肯定要大于目标值,但是这里区间长度也会增加,所以后面的值就不可能是求的值
在这里插入图片描述
这里就是使用单调性,规避了很多没有必要的枚举行为,这里也是正确的


这里的时间复杂度O(N)
因为这个时候left 走一步,right 走一步,因此是O(N)

代码:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length;
        int sum = 0;
        int len = Integer.MAX_VALUE;
        for (int left = 0, right = 0; right < n; right++ ) {
            sum += nums[right];//进窗口
            while(sum >= target) {//判断
                len = Math.min(len,right - left + 1);//更新结果
                sum -= nums[left++];//出窗口
            }
        }
        return len == Integer.MAX_VALUE ? 0 : len;
    }
}

在这里插入图片描述

3. 无重复字符的最长子串

在这里插入图片描述
原题数组

题干:

我们看题干,这里有了“子串”这样的概念
“子串”和“子数组”很相似,都是连续的一段

这里要找到一串子串不重复的最长子串
在这里插入图片描述

算法原理:

1、暴力枚举 + 哈希表(判断字符是否重复出现)

固定一个起始位置,向后拓展,直到后面的字符跟子串里面有相同的元素,统计长度

这个时候我们借用哈希表,凡是重复

时间复杂度:O(N2)


优化:
由于right 走到 后面的 a 的时候,left++,然后如果到 e 再次进行遍历,那么其实走到 a 还是重复
这个时候我们就可以直接跳过 a ,这时候 right 就不用回去了,直接++
如果是这样的话,left++ 然后 right++,都不往后退,这个时候我们就可以优化为“滑动窗口

在这里插入图片描述

2、利用规律,使用“滑动窗口”来解决问题

  1. 定义 left 和 right 来充当左右端点
  2. 进窗口(让字符进窗口)
  3. 判断(当窗口内出现重复字符)
  4. 出窗口(要跟判断进行循环,从哈希表中删除该字符)
  5. 更新结果(就题论题)
    在整个判断结束之后更新结果

代码:

class Solution {
    public int lengthOfLongestSubstring(String ss) {
        char[] s = ss.toCharArray();

        int[] hash = new int[128];//用数组模拟哈希表
        int left = 0;
        int right = 0;
        int n = ss.length();
        int ret = 0;
        while(right < n) {
            hash[s[right]]++;//进入窗口
            //这里s[right]是字符所在的下标,把它放入到hash数组对应的下标中
            while(hash[s[right]] > 1) {//判断
                hash[s[left++]]--;//出窗口 值归零
            }
            ret = Math.max(ret, right - left + 1);//更新结果
            right++;//让下一个字符进入窗口
        }
        return ret;
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过查看ThreadLocal的源码进行简单理解

目录 为什么要使用ThreadLocal&#xff1f; 简单案例 ThreadLocal源码分析 断点跟踪 为什么要使用ThreadLocal 在多线程下&#xff0c;如果同时修改公共变量可能会存在线程安全问题&#xff0c;JDK虽然提供了同步锁与Lock等方法给公共访问资源加锁&#xff0c;但在高并发…

光学3D表面轮廓仪超0.1nm纵向分辨能力,让显微形貌分毫毕现

在工业应用中&#xff0c;光学3D表面轮廓仪超0.1nm的纵向分辨能力能够高精度测量物体的表面形貌&#xff0c;可用于质量控制、表面工程和纳米制造等领域。 与其它表面形貌测量方法相比&#xff0c;光学3D表面轮廓仪达到纳米级别的相移干涉法(PSI)和垂直扫描干涉法(VSI)&#x…

深度学习记录--初识向量化

什么是向量化&#xff1f; 之前计算logistic回归损失函数时&#xff0c;在代码实现时&#xff0c;讨论了for循环&#xff1a;过多的for循环会拖慢计算的速度(尤其当数据量很大时) 因此&#xff0c;为了加快计算&#xff0c;向量化是一种手段 运用python的numpy库&#xff0c…

数学建模之典型相关分析

发现新天地,欢迎访问 介绍 典型相关分析&#xff08;Canonical Correlation analysis&#xff09;研究两组变量&#xff08;每组变量中都可能有多个指标&#xff09;之间相关关系的一种多元统计方法。它能够揭示出两组变量之间的内在联系。 例子 我们要探究观众和业内人士对…

Appwidget开发基本介绍

本篇主要对appwidget开发进行简单介绍&#xff0c;为后续漏洞挖掘相关做前置铺垫 appwidget简介 官方解释如下&#xff1a; 应用微件是可以嵌入其他应用&#xff08;如主屏幕&#xff09;并接收定期更新的微型应用视图。这些视图称为界面中的微件&#xff0c;您可以使用应用微…

ZLMediakit-method ANNOUNCE failed: 401 Unauthorized(ffmpeg、obs推流rtmp到ZLM发现的问题)

错误截图 解决办法&#xff1a;能推流成功&#xff0c;但是不能写入到wvp数据库中 修改配置文件config.ini 改成0 修改之后 重启服务 systemctl restart zlm*推流成功 解决办法&#xff1a;能推流&#xff0c;能写入数据库中 替换zlm版本&#xff0c;可以用我文章中提供的编译…

SpringDataRedis 操作 Redis,并指定数据序列化器

文章目录 1. SpringDataRedis 概述2. 快速入门2.1 导入pom坐标2.2 配置文件2.3 测试代码2.4 数据序列化器2.5 StringRedisTemplate2.6 总结 1. SpringDataRedis 概述 SpringData 是Spring 中数据操作的模块&#xff0c;包含对各种数据库的集成&#xff0c;其中对Redis的集成模…

Linux Makefile的认识及CMake的使用

1 Makefile的作用 Makefile 指的是一个叫 Makefile 的文件,里面提前写了一些指令。每次要自动化的完成一个比较复杂项目的自动编译用的时候,就在命令行输入“make”命令Makefile使用。使用Makefile可以 “智能” 的知道: 1 哪些文件需要先进行编译。 2 当某一文件在某次mak…

【动态规划】LeetCode-LCR166.珠宝的最高价值

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…

GODOC命令无效,原因是需要手动安装

在看《GO程序设计语言》这本书&#xff0c;按照其中的内容&#xff0c;想看下GO自带的包的文档。 书中讲&#xff0c;可以直接输入GoDOC命令来打开一个服务器&#xff0c;从而可以用浏览器访问文档库。输入命令后&#xff0c;系统提示找不到该命令。 查了资料后才发现&#xff…

SpringAMQP入门案例——发送消息

依赖 <!--SpringAMQP起步依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> yml配置文件 自行修改 spring:rabbitmq:host: 192.168.220.130 # …

西南科技大学模拟电子技术实验五(集成运算放大器的应用设计)预习报告

一、计算/设计过程 设计一:用集成运放设计一个输入为0.05v,放大为-100的反相比例运算电路。 对于理想电路,反相比例运算电路的输出电压与输入电压之间的关系如下: =-100,所以 =100 若是假定R1为100k,则R2= =1k 为了减小输入级偏置电流引起的运算误差,在同相输入端…

【Element-ui】InputNumber 计数器与Select 选择器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、InputNumber 计数器1.1 基础用法&#xff1a;1.2 禁用状态1.3 步数1.4 严格步数1.5 精度1.6 尺寸1.7 按钮位置1.8 Events1.9 Methods 二、Select 选择器2.1…

编程怎么学才能快速入门,分享一款中文编程工具快速学习编程思路,中文编程工具之边条主控菜单构件简介

编程怎么学才能快速入门&#xff0c;分享一款中文编程工具快速学习编程思路&#xff0c;中文编程工具之边条主控菜单构件简介 一、前言 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之扩展系统菜单构件教程编程系统化教程链接https://jywxz.blog…

Istio可观测性

Istio可观测性 image-20231129072302901 前言 Istio 为网格内所有的服务通信生成详细的遥测数据。这种遥测技术提供了服务行为的可观测性&#xff0c;使运维人员能够排查故障、维护和优化应用程序&#xff0c;而不会给开发人员带来其他额外的负担。通过 Istio&#xff0c;运维…

基于 Vue、Datav、Echart 框架的 “ 数据大屏项目 “,通过 Vue 组件实现数据动态刷新渲染,内部图表可实现自由替换

最近在研究大数据分析&#xff0c;基于 Vue、Datav、Echart 框架的 " 数据大屏项目 "&#xff0c;通过 Vue 组件实现数据动态刷新渲染&#xff0c;内部图表可实现自由替换。部分图表使用 DataV 自带组件&#xff0c;可进行更改&#xff0c;详情请点击下方 DataV 文档…

伪原创API,批量创作伪原创文章

内容创作已经成为互联网领域中不可或缺的一环。越来越多的内容创作者和网站管理员开始寻找更高效的伪原创工具&#xff0c;以确保其内容的独特性。 百度文心一言API 我们来了解一下百度文心一言API。作为百度文心推出的一项人工智能服务&#xff0c;通过自然语言处理技术&…

态势感知是什么

在当今高度信息化的时代&#xff0c;信息安全风险已经成为企业、政府和个人的重要关注点。为了有效应对这些风险&#xff0c;态势感知成为了一种日益重要的能力。态势感知是一种基于环境的、动态、整体地洞悉安全风险的能力&#xff0c;是以安全大数据为基础&#xff0c;从全局…

水果编曲软件fl studio手机版下载

fl studio mobile手机版中文名水果编曲软件&#xff0c;它是一款非常不错的音乐编曲软件&#xff0c;凭借简单易上手的操作方式&#xff0c;强悍且实用的功能&#xff0c;深受到了音乐创作者的喜爱&#xff0c;不仅仅提供了广阔的音乐创作空间&#xff0c;可以让用户对舞曲、轻…

可视化开源编辑器Swagger Editor本地部署并实现远程访问管理编辑文档

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagge…
最新文章