【算法刷题】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.mzph.cn/news/195829.shtml

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

相关文章

大数据项目——基于Django协同过滤算法的房源可视化分析推荐系统的设计与实现

大数据项目——基于Django协同过滤算法的房源可视化分析推荐系统的设计与实现 技术栈&#xff1a;大数据爬虫/机器学习学习算法/数据分析与挖掘/大数据可视化/Django框架/Mysql数据库 本项目基于 Django框架开发的房屋可视化分析推荐系统。这个系统结合了大数据爬虫、机器学习…

100G数据中心升级改造策略

视频流媒体的兴起和物联网设备的大幅增长带来数据量爆炸性增长&#xff0c;人们对算力的需求越来越大&#xff0c;网络的升级改造也成为每个数据中心关注的重点。为了应对网络压力&#xff0c;数据中心需要升级到100G及以上速率&#xff0c;为企业和用户提供高性能计算、存储和…

Python读写XML文件:深入解析与技术实现

目录 一、引言 二、XML文件基础 1、XML文件结构 2、XML文件语法规则 三、Python读取XML文件 1、使用内置库xml.etree.ElementTree 2、使用第三方库lxml 四、Python写入XML文件 1、使用内置库xml.etree.ElementTree 五、注意事项 六、总结 一、引言 XML&#xff08;…

JS前端逆向

前言 js逆向一直没有相关了解&#xff0c;虽然目前渗透遇见的不是很多&#xff0c;大多数遇见的要么不加密&#xff0c;要么无法实现其加密流程&#xff0c;不过最近看到了一个较为简单的站点正好能够逆向出来&#xff0c;就做了简单记录。本文旨在介绍js逆向的一些基础思路&am…

spring cache 学习 —— @Cacheable 使用详解

1. 功能说明 Cacheable 注解在方法上&#xff0c;表示该方法的返回结果是可以缓存的。也就是说&#xff0c;该方法的返回结果会放在缓存中&#xff0c;以便于以后使用相同的参数调用该方法时&#xff0c;会返回缓存中的值&#xff0c;而不会实际执行该方法。 注意&#xff0c;这…

蓝桥杯真题:四平方和

import java.io.*;/*先找后两个数for(int i 0; 2 * i * i < n;i)for(int j i; i * i j * j < n;j ) 再找前两个数 for(int i 0;4 * i * i < n; i )for(int j i;2 * (j * j i * i) < n;j )//这样就可以让后两个数尽量大,前两个数尽量小 这样就可以确定后…

HTML5+CSS3+Vue小实例:浪漫的心形文字动画特效

实例:浪漫的心形文字动画特效 技术栈:HTML+CSS+Vue 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conte…

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A 目录 2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A 需要环境或者解析可以私信 &#xff08;二&#xff09;A 模块基础设施设置/安全加固&#xff08;200 分&…

行业分析:2023年藜麦市场竞争格局及发展现状分析

藜麦是藜科藜属植物。穗部可呈红、紫、黄&#xff0c;植株形状类似灰灰菜&#xff0c;成熟后穗部类似高粱穗。植株大小受环境及遗传因素影响较大&#xff0c;从0.3-3米不等&#xff0c;茎部质地较硬&#xff0c;可分枝可不分。单叶互生&#xff0c;叶片呈鸭掌状&#xff0c;叶缘…

Pytorch CIFAR10图像分类 Swin Transformer篇

Pytorch CIFAR10图像分类 Swin Transformer篇 文章目录 Pytorch CIFAR10图像分类 Swin Transformer篇4. 定义网络&#xff08;Swin Transformer&#xff09;Swin Transformer整体架构Patch MergingW-MSASW-MSARelative position biasSwin Transformer 网络结构Patch EmbeddingP…

数据结构学习笔记——二叉树的遍历和链式存储代码实现二叉树

目录 一、二叉树的遍历&#xff08;一&#xff09;二叉树的先序遍历&#xff08;DLR&#xff09;&#xff08;二&#xff09;二叉树的中序遍历&#xff08;LDR&#xff09;&#xff08;三&#xff09;二叉树的后序遍历&#xff08;LRD&#xff09;&#xff08;四&#xff09;先…

如何使用群晖管家结合内网穿透实现公网远程访问本地黑群晖

白嫖怪狂喜&#xff01;黑群晖也能使用群晖管家啦&#xff01; 文章目录 白嫖怪狂喜&#xff01;黑群晖也能使用群晖管家啦&#xff01;1.使用环境要求&#xff1a;2.下载安装群晖管家app3.随机地址登陆群晖管家app4.固定地址登陆群晖管家app 自己组装nas的白嫖怪们虽然也可以通…

微信小程序引入node_modules依赖

微信小程序不支持直接读取node_modules 首先在目录文件夹下cmd输入npm init命令 D:\小程序\project\calendar\calendar_1>npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible…

linux resin的安装

1. 下载安装包 1.1 下载地址&#xff1a;https://caucho.com/products/resin/download 这里我下载的是普通版本的resin&#xff0c;没有选resin pro 版本。 科普一下&#xff0c;从性能上来说 resin和resin pro 版本的性能没区别。 resin pro 版本的 和resin 普通版本的文件是…

无惧泄密:揭秘上海迅软DSE防拷贝大杀器!

对于企事业单位而言&#xff0c;文档的安全保护不仅要从源头上进行&#xff0c;杜绝文档在使用、传播过程中产生的泄密风险&#xff0c;同时也要对文档内容本身进行保护。为防止有心人通过拷贝、截屏、拍照等方式盗窃走重要文档内容信息的情况&#xff0c;天锐绿盾文件防泄密软…

HTTP 缓存机制

一、强制缓存 只要浏览器判断缓存没有过期&#xff0c;则直接使用浏览器的本地缓存而无需再请求服务器。 强制缓存是利用下面这两个 HTTP 响应头部&#xff08;Response Header&#xff09;字段实现的&#xff0c;它们都用来表示资源在客户端缓存的有效期&#xff1a; Cache…

Python基础快速过一遍

文章目录 一、变量及基本概念1、变量2、变量类型3、变量格式化输出4、type()函数5、input()函数6、类型转换函数7、注释 二、Python运算/字符1、算数运算2、比较运算3、逻辑运算4、赋值运算符5、转义字符6、成员运算符 三、判断/循环语句1、if判断语句2、while循环语句3、for循…

等保测评报价相差很大,里面有什么门道

等保测评报价的差异主要源于以下几点&#xff1a; 服务质量评估标准不同&#xff1a;不同的测评机构在测评过程中所提供的服务范围、深度、细节等方面可能存在差异&#xff0c;因此导致报价有所不同。一些机构可能提供全面且细致的测评服务&#xff0c;致力于提供高质量的等保测…

openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数

文章目录 openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数139.1 操作步骤139.2 异常处理 openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数 如果应用程序与数据库的连接数超过最大值&#xff0c;则新的连接无法建立。建议每天检查连…

一种结构新颖的双通带超导滤波器设计

闫鑫1,2&#xff0c;季来运1&#xff0c;张浩1,2&#xff0c;李颢毅1,2&#xff0c;王昭月1,2&#xff0c;曹凤莹1,2 &#xff08;1.天津海芯电子有限公司&#xff0c;天津300380&#xff1b;2.天津师范大学物理与材料科学学院&#xff0c;天津 300387.&#xff09; 摘要&…