刷题之动态规划-子数组

news2024/11/27 2:47:38

前言

大家好,我是jiantaoyab,开始刷动态规划的子数组类型相关的题目

动态规划5个步骤

  1. 状态表示 :dp数组中每一个下标对应值的含义是什么>dp[i]表示什么
  2. 状态转移方程: dp[i] 等于什么
  3. 1 和 2 是动态规划的核心步骤,第三步是初始化,保证填表的时候不越界
  4. 填表顺序:为了保证填写当前状态的时候,所需要的状态已经计算过
  5. 返回值

最大子数组和

image-20240401083340640

题目分析

image-20240401085514096

dp[i] : 到达 i 位置所有子数组中的最大和

dp[i] = max(nums[i], dp[i - 1] + nums[i]);

初始化:新增加一个数初始化为0

返回值:dp表中最大的元素

代码

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
      int n = nums.size();
      vector<int> dp(n + 1);
      int ret = INT_MIN;
      for(int i = 1; i <= n; i++)
      {
        dp[i] = max(nums[i - 1], dp[i - 1] + nums[i - 1]);
         ret = max(ret, dp[i]);
      }    
      return ret;

    }
};

环形子数组的最大和

image-20240401085628935

题目分析

image-20240401094858640

代码

class Solution {
public:
    int maxSubarraySumCircular(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n + 1);
        vector<int> g(n + 1);
        int f_max = INT_MIN;
        int g_min = INT_MAX;
        int sum = 0;
        for(int i = 1; i <= n; i++)
        {
          sum += nums[i - 1];
          f[i] = max(nums[i - 1], f[i - 1] + nums[i - 1]);
          f_max = max(f_max, f[i]);
          g[i] = min(nums[i - 1], g[i - 1] + nums[i - 1]);        
          g_min = min(g_min, g[i]);
        }
        // g_min == sum 说明数组里面全是负数
        return g_min == sum ? f_max : max(f_max, sum - g_min);
    }
};

乘积最大子数组

image-20240401095011222

题目分析

image-20240401103312638

代码

class Solution {
public:
    int maxProduct(vector<int>& nums) {
      int n = nums.size();
      vector<int> f(n + 1);
      vector<int> g(n + 1);
      f[0] = g[0] = 1;
      int ret = INT_MIN;
      for(int i = 1; i <= n; i++)
      {
        f[i] = max(max(f[i - 1] * nums[i - 1], g[i - 1]* nums[i - 1]), nums[i - 1]);
        g[i] = min(min(f[i - 1] * nums[i - 1], g[i - 1]* nums[i - 1]), nums[i - 1]);
        ret = max(ret, f[i]);
      }
      return ret; 
    }
};

乘积为正数的最长子数组长度

image-20240402150934945

题目分析

image-20240402154516758

初始化: f[0] = g[0] = 0;

返回值:返回f[i] 中的最大值

代码

class Solution {
public:
    int getMaxLen(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n + 1);
        vector<int> g(n + 1);
        int ret = INT_MIN; 
        for(int i = 1; i <= n; i++)
        {
          if(nums[i - 1] > 0)
          {
            f[i] = f[i - 1] + 1;
            g[i] = g[i - 1] == 0 ? 0 : g[i - 1] + 1;

          }
          else if(nums[i - 1] < 0)
          {
            f[i] = g[i - 1] == 0 ? 0 : g[i - 1] + 1;
            g[i] = f[i - 1] + 1;
          }
          ret = max(ret, f[i]);
        }
        return ret;

    }
};

等差数列划分

image-20240402154638466

题目分析

image-20240402161848516

代码

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

最长湍流子数组

image-20240402161945444

题目分析

image-20240402171552549

初始化:都初始化为1,再去填就好了

返回值:返回的是f 表 和 g表中最大的值

代码

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

单词拆分

image-20240403080845664

题目分析

image-20240403084453127

代码

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> hash;
        for(auto&  str : wordDict) hash.insert(str);
        int n  = s.size();
        vector<bool> dp(n + 1);
        dp[0] = true;
        s = ' ' + s; //字符串下标统一 + 1
        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];
    }
};

环绕字符串中唯一的子字符串

image-20240403084753372

题目分析

image-20240403092021640

代码

class Solution {
public:
    int findSubstringInWraproundString(string s) {
        int n = s.size();
        vector<int> dp (n, 1);
        for(int i = 1; i < n; i++)
        {
          if(s[i - 1] + 1 == s[i] || (s[i - 1] == 'z' && s[i] == 'a'))
          {
            dp[i] += dp[i - 1];
          }
        }

        int hash[26] = {0};
        for(int i = 0; i < n; i++)
        {
          hash[s[i] - 'a'] = max(hash[s[i] - 'a'], dp[i]);
        }
        int sum = 0;
        for(auto x : hash) sum += x;
        return sum;
    }
};

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

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

相关文章

深度学习理论基础(五)卷积神经网络CNN

目录 前述&#xff1a;卷积神经网络基础1.卷积网络流程2.卷积网络核心3.卷积下采样4.卷积上采样--转置卷积 一、卷积神经网络层1.卷积层&#xff08;1&#xff09;内部参数&#xff1a;卷积核权重&#xff08;2&#xff09;内部参数&#xff1a;偏置&#xff08;3&#xff09;外…

dm8 开启归档模式

dm8 开启归档模式 1 命令行 [dmdbatest1 dm8]$ disql sysdba/Dameng123localhost:5237服务器[localhost:5237]:处于普通打开状态 登录使用时间 : 3.198(ms) disql V8 SQL> select name,status$,arch_mode from v$database;行号 NAME STATUS$ ARCH_MODE ----------…

DETR【Transformer+目标检测】

End-to-End Object Detection with Transformers 2024 NVIDIA GTC&#xff0c;发布了地表最强的GPU B200&#xff0c;同时&#xff0c;黄仁勋对谈《Attention is All You Need》论文其中的7位作者&#xff0c;座谈的目的无非就是诉说&#xff0c;Transformer才是今天人工智能成…

【JavaWeb】百度地图API SDK导入

百度地图开放平台 | 百度地图API SDK | 地图开发 (baidu.com) 登录注册&#xff0c;创建应用&#xff0c;获取AK 地理编码 | 百度地图API SDK (baidu.com) 需要的接口一&#xff1a;获取店铺/用户 所在地址的经纬度坐标 轻量级路线规划 | 百度地图API SDK (baidu.com) 需要的…

第117讲:深入MySQL性能优化:从多个角度提升数据库性能

文章目录 1.从哪些角度去考虑MySQL的优化2.数据库服务器的选型3.从操作系统层面去优化MySQL数据库3.1.关于CPU方面的优化3.2.关于内存方面的优化3.3.关于磁盘IO方面 4.应用端的优化5.数据库系统优化工具6.数据库系统参数优化6.1.最大连接数的优化&#xff08;max_connections&a…

【Entity Framework】EF日志-简单日志记录

【Entity Framework】EF日志-简单日志记录 文章目录 【Entity Framework】EF日志-简单日志记录一、概述二、EF日志分类三、简单的日志记录3.1 配置3.2 日志记录到控制台3.3 记录到凋试窗口3.4 记录到文件3.5 敏感数据处理3.6 详细查询异常3.6 日志级别3.7 消息内容和格式设置 一…

Paragon NTFS for Mac15直装版2024最新安装包下载

Paragon NTFS for Mac 是一款专为 Mac 用户设计的软件&#xff0c;它解决了 Mac 系统无法直接读写 NTFS 格式硬盘的问题。通过安装这款软件&#xff0c;Mac 用户可以像使用本机磁盘一样&#xff0c;轻松地在 NTFS 格式的硬盘、U 盘等存储设备上读写文件&#xff0c;无需进行任何…

Protobuf 二进制文件学习及解析

0. 简介 protobuf也叫protocol buffer是google 的一种数据交换的格式&#xff0c;它独立于语言&#xff0c;独立于平台。google 提供了多种语言的实现&#xff1a;java、c#、c、go 和 python&#xff0c;每一种实现都包含了相应语言的编译器以及库文件。 由于它是一种二进制的…

【吊打面试官系列】Redis篇 -Redis 最适合的场景?

大家好&#xff0c;我是锋哥。今天分享关于 【Redis 最适合的场景&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Redis 最适合的场景&#xff1f; Redis 最适合的场景? Redis最适合的场景通常包括以下几点&#xff1a; 缓存系统&#xff1a;Redis提供了快速…

SpringBoot中操作Bean的生命周期的方法

引言 在 Spring Boot 应用中&#xff0c;管理和操作 Bean 的生命周期是一项关键的任务。这不仅涉及到如何创建和销毁 Bean&#xff0c;还包括如何在应用的生命周期中对 Bean 进行精细控制。Spring 框架提供了多种机制来管理 Bean 的生命周期&#xff0c;这些机制使得开发者可以…

应用方案D78040场扫描电路,偏转电流可达1.7Ap-p,可用于中小型显示器

D78040是一款场扫描电路&#xff0c;偏转电流可达1.7Ap-p&#xff0c;可用于中小型显示器。 二 特 点 1、有内置泵电源 2、垂直输出电路 3、热保护电路 4、偏转电流可达1.7Ap-p 三 基本参数 四 应用电路图 1、应用线路 2、PIN5脚输出波形如下&#xff1a;

多态的综合练习

题目要求 Animal类&#xff08;父类&#xff09; package www.jsu.com;public class Animal {private int age;private String color;public Animal() {}public Animal(int age, String color) {this.age age;this.color color;}public int getAge() {return age;}public voi…

数据安全之认识数据库防火墙

文章目录 一、什么是数据库防火墙二、数据库防火墙的主要功能三、数据库防火墙的工作原理四、数据库防火墙如何防护数据库免受SQL注入攻击五、数据库防火墙的部署方式六、数据库防火墙与网络防火墙的关系与区别七、数据库防火墙的应用场景 随着信息技术的快速发展&#xff0c;数…

ubuntu16如何使用高版本cmake

1.引言 最近在尝试ubuntu16.04下编译开源项目vsome&#xff0c;发现使用apt命令默认安装cmake的的版本太低。如下 最终得知&#xff0c;ubuntu16默认安装确实只能到3.5.1。解决办法只能是源码安装更高版本。 2.源码下载3.20 //定位到opt目录 cd /opt 下载 wget https://cmak…

蓝桥杯 - 受伤的皇后

解题思路&#xff1a; 递归 回溯&#xff08;n皇后问题的变种&#xff09; 在 N 皇后问题的解决方案中&#xff0c;我们是从棋盘的顶部向底部逐行放置皇后的&#xff0c;这意味着在任何给定时间&#xff0c;所有未来的行&#xff08;即当前行之下的所有行&#xff09;都还没…

昆仑万维将在4月17日正式开启“天工大模型3.0”的公测,并选择开源,音乐生成大模型“天工SkyMusic”开启内测

&#x1f989; AI新闻 &#x1f680; 昆仑万维发布全球最大MoE模型“天工3.0” 摘要&#xff1a;昆仑万维集团近日通过官方公众号宣布&#xff0c;将在4月17日正式开启“天工大模型3.0”的公测&#xff0c;并选择开源。此版本采用4000亿参数的混合专家模型(MoE)&#xff0c;被…

(echarts)vue中循环生成多个相同的echarts图表,但数据动态、第一次渲染失败问题

(echarts)vue中循环生成多个相同的echarts图表&#xff0c;但数据动态 效果&#xff1a; 代码&#xff1a; <!-- 动态图表 --> <el-row :gutter"20"><el-col v-for"(item,index) in echartsList" :key"index" :span"10&quo…

Android Studio学习7——常用控件view

Android控件 双击shift键——>搜索想要找的文件 Ctrlshift回车——>补全“&#xff1b;”号 CtrlX——>删除一行&#xff0c;只需把鼠标放在那一行 windows自带字体

如何备份极狐GitLab 信任域名证书

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何使用极狐GitLa…

深信服:借助观测云实现全链路可观测性

导读 深信服科技股份有限公司 简称「深信服」&#xff08; Sangfor Technologies Inc. &#xff09;&#xff0c;是一家领先的网络安全和云计算解决方案提供商&#xff0c;致力于为全球客户提供高效、智能、安全的网络和云服务。随着公司业务的不断扩展&#xff0c;也面临着监…