【OJ】动规练习六

news2025/1/19 13:17:33

个人主页 : zxctscl
如有转载请先通知

题目

  • 1. 413. 等差数列划分
    • 1.1 分析
    • 1.2 代码
  • 2. 978. 最长湍流子数组
    • 2.1 分析
    • 2.2 代码
  • 3. 139. 单词拆分
    • 3.1 分析
    • 3.2 代码

1. 413. 等差数列划分

在这里插入图片描述

1.1 分析

一、题目解析:
至少有三个元素才能构成等差数列,题目要求返回的是子序列等差数列的个数

二、算法原理:

  1. 状态表示
    以i位置为结尾,找所有子数组中有多少个等差数列
    dp[i]表示以i位置为结尾的所有子数组中有多少个等差数列。

  2. 状态转移方程
    在这里插入图片描述
    子数组是连续的,如果i位置是等差数列的子序列,那么它前面的两个至少也是构成等差数列。

第一种:考虑abc构成等差数列:c-b=b-a
如果abc能构成等差数列,那么以ab结尾的所有的等差数列再加上一个c也是等差数列。
以ab为结尾,也就是以b为结尾,那么以b结尾的所有子数组等差数列就有dp[i-1]个。但是ab就不在这个数列里面,可abc能构成等差数列,但是也多了一种,所以得多加一个1,这里的1是多加了abc这样的一种情况。

第二种:考虑abc不构成等差数列:c-b≠b-a
那么前面的数再多也不能构成等差数列,此时dp[i]=0。

状态转移方程:dp[i]=c-b==b-a?dp[i-1]+1:0

  1. 初始化
    在这里插入图片描述
    因为要三个才能构成等差数列,所以
    dp[0]=0
    dp[1]=0

  2. 填表顺序
    从左往右

  3. 返回值
    题目要求返回的不一定是最后一个位置的值,而是所有子序列等差数列的个数,所以得全部加起来。返回值就是dp表中所以元素的和。
    在这里插入图片描述

1.2 代码

class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& nums) {
      int n=nums.size();
      vector<int> dp(n);
      if(n<=2)return 0;
      int sum=0;
       for(int i=2;i<n;i++)
       {
         
         dp[i]=nums[i]-nums[i-1]==nums[i-1]-nums[i-2]?dp[i-1]+1:0;
         sum+=dp[i];
       }
       return sum;
    }
};

2. 978. 最长湍流子数组

在这里插入图片描述

2.1 分析

一、题目解析:
湍流数组意思是相邻两个元素大小一升一降
在这里插入图片描述
像题目给的例子1就是在第二个位置4和第三个位置都是降的就不行2。而到了第七个位置8和第六个位置8是平的没有变化,就不是湍流数组,所以例1的最大湍流数组长度就是5。
在这里插入图片描述
在例2中都是升的,所以最大湍流数组长度就是2。
在这里插入图片描述
在例1中只有一个元素,所以最大湍流数组长度就是1。
在这里插入图片描述

二、算法原理:

  1. 状态表示
    以某一个位置为结尾
    如果以dp[i]表示以i位置为结尾的所以子数组中,最长的湍流数组长度,那么可能会出现三种情况最后一个位置可能会出现下降趋势,也可能是上升趋势,还可以是水平的,一个状态表示不能满足情况,所以得换状态表示。
    **f[i]表示i位置为结尾的所以子数组中,最后呈现“上升”**状态下,最长的湍流数组长度
    **g[i]表示i位置为结尾的所以子数组中,最后呈现“下降”**状态下,最长的湍流数组长度

  2. 状态转移方程
    在f[i]中会出现三种情况,第一种:i-1大于i,这样就不能呈现上升状态,所以i位置自己成为上升状态。第二种:i-1小于i,刚好呈现上升状态,接下来就要i-1位置为结尾成下降状态,就是g[i-1]。第三种,i位置的值和i位置相同,就得自己成为上升状态。
    在这里插入图片描述

在g[i]中会出现两种情况,第一种:i-1小于i,这样就不能呈现下降状态,所以i位置自己成为下降状态。第二种:i-1打于i,刚好呈现下降状态,接下来就要i-1位置为结尾成上升状态,就是f[i-1]。第三种,i位置的值和i位置相同,就得自己成为下降状态。
在这里插入图片描述

  1. 初始化

在f表和g表中最差的情况就是1,所以把表中元素全部初始化为1。这样就减少了很多判断情况。

  1. 填表顺序
    从左往右
    两个表一起填

  2. 返回值
    返回f表和g表中最大的那个
    在这里插入图片描述

2.2 代码

class Solution {
public:
    int maxTurbulenceSize(vector<int>& arr) {
        int n=arr.size();
        vector<int> f(n,1),g(n,1);
       int ret=1;
        for(int i=1;i<n;i++)
        {
            if(arr[i-1]<arr[i])
            {
            f[i]=g[i-1]+1;
            }
            else if(arr[i-1]>arr[i])
            {
            g[i]=f[i-1]+1;
            }
            ret=max(ret,max(f[i],g[i]));
        }
        return ret;
    }
};

3. 139. 单词拆分

在这里插入图片描述

3.1 分析

一、题目解析:
在给的 wordDict 字典里面可以重复使用某一个单词,还没有要求全部使用。
看一下给的例2:s里面给的字符串就可以在wordDict 字典里面找到就返回true。
在这里插入图片描述
例3:第一单词不管是选择cat还是cats最后剩下的og在wordDict 字典里面都没有找到,就返回false。
在这里插入图片描述

二、算法原理:

  1. 状态表示
    以某一个位置为结尾
    dp[i]表示以i位置为结尾的[0,i]区间内的字符串,能否被字典中的单词拼接而成。能被拼接而成就是true,不能就是false。

  2. 状态转移方程
    根据最后一个位置的情况来划分问题:前面那一部分单词,加上最后一个单词,而最后一个单词中的i,只要能确定前面部分能拼接而成,并且最后一个单词在wordDict 字典里面能找到,那么这个字符串就能拼接而成。
    在这里插入图片描述
    那么在设一个变量j来作为左边部分的最后一个下标,左边这个字符串的开始在0,结尾在j-1,这个区间能否作为字典中的单词拼接而成就是dp[j-1],右边这个位置就[j,i]组成的单词是否在字典中就行。左右两种情况都为true的时候就能拼接。
    在这里插入图片描述

  3. 初始化

为了dp[j-1]不越界,就加一个虚拟节点。为了保证后面的填表顺序是正确,那么dp[0]=true。
还得注意下标的映射关系,这里加了一个新节点,那么s表就得加一个辅助字符。

  1. 填表顺序
    从左往右

  2. 返回值
    题目要求返回是s字符串能否被拼接,就是dp[n]。
    在这里插入图片描述

3.2 代码

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
    unordered_set<string> hash;
    for(auto& s: wordDict)hash.insert(s);
     int n=s.size();
     vector<bool>dp(n+1);
     dp[0]=true;
     s=' '+s;
     for(int i=1;i<=n;i++)
     {
        for(int j=i;j>=1;j--)
        {
            if(dp[j-1]&&hash.count(s.substr(j,i-j+1)))
            {
                dp[i]=true;
                break;
            }
        }
     }
     return dp[n];
    }
};/*  */

有问题请指出,大家一起进步!!!

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

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

相关文章

JWT--study

JWT 1、简介 2、结构 头部 载荷 签证 应用 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>Token 生成 解析token package com.wang.utils;import io.…

用anaconda创建新的虚拟环境

1.打开Anaconda Prompt&#xff0c;进入base环境 2.确定新的虚拟环境的名字及python版本 conda create -n test python3.9选y并回车 3.创建成功 4.激活test环境 conda activate test然后就可以开始你的操作了~

通用开发技能系列:Authentication、OAuth、JWT 认证策略

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 通用开发技能系列 文章&#xff0c;主要对编程通用技能 Authentication、OAuth、JWT 认证策略 进行学习 1.Basic Authentication认证 每个请求都需要将 用户名密码 进行base64编码后&#xff0c;放在请求头的A…

Oracle RAC One Node,双胞胎变独生子?

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

Redis从入门到精通(四)Redis实战(二)商户查询缓存

↑↑↑请在文章头部下载测试项目原代码↑↑↑ 文章目录 前言4.2 商户查询缓存4.2.1 缓存介绍4.2.2 查询商户信息的传统做法4.2.2.1 接口文档4.2.2.2 代码实现4.2.2.3 功能测试 4.2.3 查询商户信息添加Redis缓存4.2.3.1 逻辑分析4.2.3.2 代码实现4.2.3.3 功能测试 4.2.3 数据一致…

【Week-Y4】修改yolov5s中C3模块的结构,common.py文件解读

修改C3模块的结构 一、commom.py文件解析二、修改代码&#xff0c;运行train.py训练 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 &#x1f4d5;本次任务&#xff1a;将yolov5s网络模型…

LangChain入门:11.Pydantic(JSON)解析器实战

摘要 在数字化营销的浪潮中&#xff0c;自动化内容生成成为了提升效率和用户参与度的利器。本文将详细介绍如何利用LangChain的自然语言处理能力和Pydantic的数据验证特性&#xff0c;构建一个自动化的花店文案生成器。通过这个工具&#xff0c;您可以快速为各种花卉生成吸引人…

LLM:检索增强生成(RAG)

1 Embedding技术 简单地说&#xff0c;嵌入(Embedding)思想可以视为一种尝试通过用向量来表示所有东西的“本质”的方法&#xff0c;其特性是“相近的事物”由相近的数表示。 1.1 文本向量(Text Embedding) 在GPT中&#xff0c;文本嵌入(Text Embedding)是通过将输入文本中的每…

哲♂学家带你用顺序表实现通讯录

实现通讯录能使我们进一步加深对顺序表的理解&#xff0c;接下来就由本哲♂学家带你手把手实现通信录。 其中需要用到顺序表的知识可以点击下面链接了解&#xff1a;http://t.csdnimg.cn/9SjGd话不多说&#xff0c;我们♂开始吧。 一、通讯录头文件声明 由于我们前面已经写过…

随机生成Long全范围数

随机生成Long全范围数 前言实现思路主要代码分区随机生成过程案例&#xff1a;随机生成100个数 朴素的比较总结 前言 使用自带的Random.nextLong()函数生成Long型的长整数&#xff0c;范围比较小&#xff0c;如下图。100个随机数没看见10以内的数字。所以考虑实现随机化生成大…

基于注意力整合的超声图像分割信息在乳腺肿瘤分类中的应用

基于注意力整合的超声图像分割信息在乳腺肿瘤分类中的应用 摘要引言方法 Segmentation information with attention integration for classification of breast tumor in ultrasound image 摘要 乳腺癌是世界范围内女性最常见的癌症之一。基于超声成像的计算机辅助诊断&#x…

scp和rsync

引言 我们平时总会有在不同的设备之间传输文件的需要&#xff0c;好友同事间可以用微信、QQ、网盘等&#xff0c;还是比较方便安全的。而在linux的操作系统中&#xff0c;我们经常需要两台机器之间拷贝文件&#xff0c;或者由于业务需要备份文件&#xff0c;那就不得不用到scp和…

【React】基于JS 3D引擎库实现关系图(图graph)

主角&#xff1a;3D Force-Directed Graph 简介&#xff1a;一个使用ThreeJS/WebGL进行3D渲染的Graph图库 GitHub: https://github.com/vasturiano/3d-force-graph Ps: 较为复杂或节点巨大时&#xff0c;对GPU>CPU消耗较大&#xff0c;同量级节点对比下优于AntV G6和Echarts…

C语言之分支语句和循环语句

前言 一、什么是语句&#xff1f; 二、分支语句&#xff08;选择结构&#xff09; 2.1 if语句 2.2 switch语句 三、循环语句 3.1 while循环 3.2 break与continue语句 3.3 getchar()与putchar() 3.3.1 缓冲区 3.4 for循环 3.4.1 一些for循环的变种 3.5 do...while循…

java运行时内存

从jdk1.7以及以后&#xff0c;静态变量和常量池存在堆空间。

【TSP旅行商问题】改进的大邻域搜索算法LNS

课题名称&#xff1a;基于改进的大规模邻域搜索算法LNS求解TSP问题 版本时间&#xff1a;2024-04-01 程序运行&#xff1a;直接运行LNS_TSP.m 文件即可 代码获取方式&#xff1a; QQ&#xff1a;491052175 VX&#xff1a;Matlab_Lover 模型介绍&#xff1a; 第一步&…

[AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试

目录 关键词平台说明背景一、需求二、配置2.1 NvMBlockDescriptors2.2 NvMFeeRef2.3 FeeBlockConfigurations 三、code3.1 声明和定义3.2 调试 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编…

SpringBoot -- 外部化配置

我们如果要对普通程序的jar包更改配置&#xff0c;那么我们需要对jar包解压&#xff0c;并在其中的配置文件中更改配置参数&#xff0c;然后再打包并重新运行。可以看到过程比较繁琐&#xff0c;SpringBoot也注意到了这个问题&#xff0c;其可以通过外部配置文件更新配置。 我…

钉钉事件订阅前缀树算法gin框架解析

当钉钉监测到发生一些事件&#xff0c;如下图 此处举例三个事件user_add_org、user_change_org、user_leave_org&#xff0c;传统的做法是&#xff0c;我们写三个if条件&#xff0c;类似下图 这样字符串匹配效率比较低&#xff0c;于是联想到gin框架中的路由匹配算法&#xff0…

利用Spark将Kafka数据流写入HDFS

利用Spark将Kafka数据流写入HDFS 在当今的大数据时代&#xff0c;实时数据处理和分析变得越来越重要。Apache Kafka作为一个分布式流处理平台&#xff0c;已经成为处理实时数据的事实标准。而Apache Spark则是一个强大的大数据处理框架&#xff0c;它提供了对数据进行复杂处理…