【算法刷题】Day11

news2025/1/24 5:35:28

文章目录

  • 面试题 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.coloradmin.cn/o/1279422.html

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

相关文章

【Unity动画】状态机添加参数控制动画切换(Animator Controller)

Unity - 手册&#xff1a;动画参数 在Unity中&#xff0c;动画状态的切换是通过Animator Controller中的过渡&#xff08;Transition&#xff09;来实现的。过渡是状态之间的连接&#xff0c;控制过渡一般都是靠调用代码参数 我们来实现一个案例&#xff1a; 创建动画状态机&a…

Zabbix HA高可用集群搭建

Zabbix HA高可用集群搭建 Zabbix HA高可用集群搭建一、Zabbix 高可用集群&#xff08;Zabbix HA&#xff09;二、部署Zabbix高可用集群1、两个服务端配置1.1主节点 Zabbix Server 配置1.2 备节点 Zabbix Server 配置1.3 主备节点添加监控主机1.4 查看高可用集群状态 2、两个客户…

[前 5 名] 最顶级的数据恢复软件解决方案列表

您是否在互联网上找到适用于 Windows PC 的前 5 名最受好评的数据恢复软件解决方案&#xff1f;嗯&#xff0c;在线市场上有很多工具可以恢复已删除的文件。但并不是所有的应用程序都值得使用它。值得信赖的文件恢复工具将有助于快速检索丢失、删除、格式化的数据并从计算机恢复…

数据结构和算法-线索二叉树中的线索化和在线索二叉树中找前驱后继

线索二叉树的概念 找到某个节点得按照遍历得到的序列开始遍历才能遍历全部节点&#xff0c;非常繁琐 中序线索二叉树 线索二叉树的存储结构 先序线索二叉树 后序线索二叉树 三种线索二叉树的对比 即对应前驱后后继判断标准不同 小结 二叉树的线索化 用土办法找中序前驱 当…

专治Java底子差:Java所有的运算符都在这里了

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…

JavaScript 延迟加载的艺术:按需加载的最佳实践

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Python海绵宝宝

目录 系列文章 写在前面 海绵宝宝 写在后面 系列文章 序号文章目录直达链接表白系列1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595.blog.cs…

【毕业设计】基于雷达与深度学习的摔倒检测——微多普勒效应

运动物体的微多普勒效应为人体动作识别提供了可能&#xff0c;基于雷达的居家检测具有良好的隐私保护性&#xff0c;且不易受环境因素影响&#xff08;如光照、温度等&#xff09;&#xff0c;近年来已受到国内外学者的广泛关注。由于雷达信号的非平稳特性&#xff0c;通过短时…

9. 双向队列

在队列中&#xff0c;我们仅能删除头部元素或在尾部添加元素。如下图所示&#xff0c;双向队列(double-ended queue)提供了更高的灵活性&#xff0c;允许在头部和尾部执行元素的添加或删除操作。 9.1 双向队列常用操作 双向队列的常用操作如下表所示&#xff0c;具体的方法名称…

MIT线性代数笔记-第21讲-特征值,特征向量

目录 21.特征值&#xff0c;特征向量打赏 21.特征值&#xff0c;特征向量 对于一个方阵 A A A&#xff0c;若 A x ⃗ λ x ⃗ A \vec{x} \lambda \vec{x} Ax λx &#xff0c;即 A x ⃗ A \vec{x} Ax 平行于 x ⃗ \vec{x} x &#xff0c;那么 λ \lambda λ是 A A A的特征值…

数据结构——堆排序的topk问题

呀哈喽&#xff0c;我是结衣 前言 今天给大家带来的堆排序的topk问题。topk就是在许多数中&#xff0c;找出前k个大的数&#xff0c;可能是几十个数&#xff0c;也可能是几千万个数中找。今天我们将要在1000000&#xff08;一百万&#xff09;个数中找出前10大的数。 知识点 C…

《地理信息系统原理》笔记/期末复习资料(7. 空间分析)

目录 7. 空间分析 7.1 空间分析的内容与步骤 7.2 数据检索及表格分析 7.2.1 属性统计分析 7.2.2 布尔逻辑查询 7.2.3 空间数据库查询语言 7.2.4 重分类&#xff0c;边界消除与合并 7.3 叠置分析 7.3.1 栅格系统的叠加分析 7.3.2 矢量系统的叠加分析&#xff08;拓扑叠…

FL Studio2024中文语言版水果编曲软件

FL Studio21.2这款软件在国内被广泛使用&#xff0c;因此又被称为"水果"。它提供音符编辑器&#xff0c;可以针对作曲者的要求编辑出不同音律的节奏&#xff0c;例如鼓、镲、锣、钢琴、笛、大提琴、筝、扬琴等等任何乐器的节奏律动。此外&#xff0c;它还提供了方便快…

二分查找:LeetCode2035:将数组分成两个数组并最小化数组和的差

本文涉及的基础知识点 二分查找算法合集 作者推荐 动态规划LeetCode2552&#xff1a;优化了6版的1324模式 题目 给你一个长度为 2 * n 的整数数组。你需要将 nums 分成 两个 长度为 n 的数组&#xff0c;分别求出两个数组的和&#xff0c;并 最小化 两个数组和之 差的绝对…

C# 使用HtmlAgilityPack解析提取HTML内容

写在前面 HtmlAgilityPack是一个HTML解析类库&#xff0c;日常用法就是爬虫获取到内容后&#xff0c;先用XPath获取目标节点&#xff0c;再用正则进行匹配&#xff1b;使用XPath的目的主要是将目标节点或内容限定在一个较小的范围&#xff0c;如果一上来就用正则那效率肯定不…

osg LOD节点动态调度

1、LOD节点 LOD&#xff08;level of detail&#xff09;&#xff1a;是指根据物体模型的结点在显示环境中所处的位置和重要度&#xff0c;决定物体渲染的资源分配&#xff0c;降低非重要物体的面数和细节度&#xff0c;从而获得高效率的渲染运算。在OSG的场景结点组织结构中&…

栈实现队列,力扣

题目地址&#xff1a; 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 难度&#xff1a;简单 今天刷栈实现队列&#xff0c;大家有兴趣可以点上看看题目要求&#xff0c;试着做一下。 题目&#xff1a; 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支…

基于社区电商的Redis缓存架构-库存模块缓存架构(下)

基于缓存分片的下单库存扣减方案 将商品进行数据分片&#xff0c;并将分片分散存储在各个 Redis 节点中&#xff0c;那么如何计算每次操作商品的库存是去操作哪一个 Redis 节点呢&#xff1f; 我们对商品库存进行了分片存储&#xff0c;那么当扣减库存的时候&#xff0c;操作…

3.4_1 java自制小工具 - pdf批量转图片

相关链接 目录参考文章&#xff1a;pdf转图片(apache pdfbox)参考文章&#xff1a;GUI界面-awt参考文章&#xff1a;jar包转exe(exe4j)参考文章&#xff1a;IDEA导入GIT项目参考文章&#xff1a;IDEA中使用Gitee管理代码gitee项目链接&#xff1a;pdf_2_image网盘地址&#xf…

HCIP-十六、IGMPPIM-SM 组播

十六、IGMP&PIM-SM 组播 IGMP实验拓扑实验需求及解法1. 配置各设备IP地址2. R1启用组播功能&#xff0c;并在g0/0/0和g0/0/1上开启pim dm3. R1的g0/0/1开启igmp协议 PIM-SM实验拓扑实验需求及解法1.配置各设备IP地址。2.运行IGP3.R1/2/3/4运行PIM-SM IGMP 实验拓扑 实验需…