蓝桥杯-动态规划专题-子数组系列,双指针

news2025/4/16 8:24:08

目录

一、单词拆分 

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

双指针-三数之和

ArrayList(Arrays.asList(array))

四、四数之和(思路和三数之和一样,只是多了一层循环)


一、单词拆分 

1.状态表示

dp[i]:到达i位置结尾,能否被dict拆分

最难的我认为到现在为止就是选择状态如何表示

dp[i]:[0,i]区间内的字符串,能否被字典中的单词拼接而成

2.状态转移方程

设置j为i位置位置最后一个单词的第一个字母

那么dp[i]->dp[j-1]==true&&s[j,i]这个字符串在dict之中

3.初始化

dp[0]=s[0]在dict中,就是true。

dp[m+1]:直接扩大一个格子,这样他就不需要考虑边界

我们可以让s这个字符串前面加一个空格

这样字符串就会往后挪动一个空格

4.顺序是

从左到右

5.返回值

dp[n]

优化:既然可以有重复,重复可以一直使用,那么可以人工把这个dict中去重放到set中,这样,重复的问题就可以不用去考虑了

简单来说,包头不包尾巴。

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
       Set<String> hash=new HashSet(wordDict);
       int m=s.length();  
       boolean []dp=new boolean[m+1];
       //加一个占位符,可以处理下标的映射关系
       s=" "+s;
       dp[0]=true;
       
//遍历从1开始,是因为不去考虑边界条件区域
//dp[i]:[0,i]区间内的字符串,能否被字典中的单词拼接而成
//设置j为i位置位置最后一个单词的第一个字母,i+1的原因是往后推了一个格子。
//--的原因是什么呢?他这个过程,我认为像是找最后一个单词的第一个字母是什么,所以才会有--的原因,是因为--从最后开始遍历去寻找
//另外,他那个sub是包头不包尾巴,所以说那个需要到i+1,但是实际也就是j-i
       for(int i=1;i<=m;i++){
           for(int j=i;j>=1;j--)
           {
               if(dp[j-1]&& hash.contains(s.substring(j,i+1))){
                   dp[i]=true;
                   //假如有一个方式匹配成功了,那么就不需要别的方式了,可以直接跳出
                   break;
               }
           }
       }
return dp[m];
    }
}

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

1.状态表示

dp[i]:到达i为止,有dp[i]个非空字符串在base中存在过

2.状态转移方程

假如说连接的情况只有两种

一种是后面减去前面的等于一

第二种就是前面的是z后面的是a相差25

假如她这个连接不起来,就是自然的单独一个

这个时候我已经看第二个实例:在想一个问题,可不可以把它放到set里面去重,假如去重来会怎么样?但是我又想到一个问题,假如去重了,那么假如这种abcdefghigklmnopqrstuvwxyza ,一圈之后还有个a,怎么办,那么这样就不能使用传统意义上的去重,不妨使用数组(26个字母,就26个容量),然后去更新数组的值,假如a[0]==xx,那么下次在第n次的时候会再次到达,a[0]更新到最大值。

双指针-三数之和

三数之和:采用双指针的操作。

class Solution {
      public static List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>>ret=new ArrayList<>();
        int m=nums.length;

        Arrays.sort(nums);
        for(int i=0;i<m;){
            int left=i+1,right=m-1;
            int a=nums[i];
            while(left<right){
                if(nums[left]+nums[right]<-a){
                    left++;
                }
                else if(nums[left]+nums[right]>-a){
                    right--;
                }
                else{
//Arrays.asList():这个方法是什么意思呢?
//这个方法的意思是将数组转化成List集合的方法。也就是说把数组这个三个元素装入List集合里面
//(1)该方法适用于对象型数据的数组(String、Integer...)

//(2)该方法不建议使用于基本数据类型的数组(byte,short,int,long,float,double,boolean)
//这个方法是使用包装类(Integer等)

//(3)该方法将数组与List列表链接起来:当更新其一个时,另一个自动更新

//(4)不支持add()、remove()、clear()等方法

  ret.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[left],nums[right])));
//缩小区间继续寻找
                    left++;
                    right--;
//对于去重:left是往右走,那么就是他和上一个看是不是一样的。
                    while(left<right&&nums[left]==nums[left-1])left++;
//right是往左走,他和右边那个是不是一样。
                    while(left<right&&nums[right]==nums[right+1])right--;

                }}
                //本身的i也需要去去重,i<m,如果i和前一个i-1一样,那么就去再次去重
                i++;
                while(i<m && nums[i]==nums[i-1])i++;
        }
        return ret;
}
}

因为left+right已经不可能会出现小于0的情况

其次我们要熟悉两个方法

我本是对JAVA的集合方面不是很熟系,所以我会在下面再去写一些我不熟悉的东西

List<List<Integer>>ret=new ArrayList<>();

Arrays.asList:这个方法,只推荐用于遍历,而不推荐进行删改等操作,它是把数组元素转换成集合,这种方法,你在修改他的时候,也会影响到原先的数组,所以推荐是(不去用它删除,只去遍历)

ArrayList(Arrays.asList(array))

与 Arrays.asList 方法一样,我们还可以使用 ArrayList<>(Arrays.asList(array)) 来从 Array 创建一个 List。

但是,与上面的方法不一样的是,使用这个方法创建的 List 是一个从老的 Array 中数据拷贝过来的,这个新的 List 与老的 Array 不相干,对新 List 中数据的操作不会影响到老的 Array 中的数据。

使用这种方法创建的 List 是可以对 List 中的元素进行添加和删除操作的。

https://www.cnblogs.com/huyuchengus/p/15132032.html

一个关于ArrayList(Array.asList(array))和普通的Array.asList()的区别

四、四数之和(思路和三数之和一样,只是多了一层循环)

class Solution {
 public  static List<List<Integer>> fourSum(int[] nums, int target) {
    List<List<Integer>>ret=new ArrayList<>();
    int m=nums.length;
    Arrays.sort(nums);
    for(int i=0;i<m;){
        for(int j=i+1;j<m;){
            int left=j+1;
            int right=m-1;
            long n=(long)target-nums[i]-nums[j];
            while(left<right){
                if(nums[left]+nums[right]>n){
                    right--;
                }
                else if(nums[left]+nums[right]<n){
                    left++;
                }
                else{
                        ret.add(new ArrayList<Integer>(Arrays.asList(nums[left], nums[i], nums[j], nums[right])));
                        left++;
                        right--;
                        while (nums[left] == nums[left - 1] && left < right) left++;
                        while (nums[right] == nums[right + 1] && left < right) right--;
                    }
                }

            j++;
            while(j<m&&nums[j]==nums[j-1]&&j<m){
                j++;
            }
        }
        i++;
        while(i>0&&i<m&&nums[i]==nums[i-1])i++;
    }
    return ret;
}
    }

这里使用long是为了处理一组数据,因为int的数值有一定范围,所以不可以用int去承载那么多的数,所以使用long

这里我还要讲一个

if  

else if

else

是说假如if不成立,看else if成不成立,但假如说if成立的情况下,这层循环结束,开始下一次循环,不执行下面逻辑的判断

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

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

相关文章

JVM进程缓存

引言 缓存在日常开发中启动至关重要的作用&#xff0c;由于是存储在内存中&#xff0c;数据的读取速度是非常快的&#xff0c;能大量减少对数据库的访问&#xff0c;减少数据库的压力。我们把缓存分为两类&#xff1a; 分布式缓存&#xff0c;例如Redis&#xff1a; 优点&…

【MySQL】MySQL 在 Centos 7环境安装教程

文章目录 1.卸载不要的环境2.检查系统安装包3.获取mysql官方yum源4.安装mysql yum 源&#xff0c;对比前后yum源5.安装mysql服务6.查看配置文件和数据存储位置7.启动服务和查看启动服务8.登录9.配置my.cnf 1.卸载不要的环境 先检查是否有mariadb存在 ps ajx |grep mariadb如果…

虚拟机VMware安装centos以及配置网络

目录 1、CentOS7的下载2、CentOS7的配置3、CentOS7的安装4、CentOS7的网络配置 4.1、自动获取IP4.2、固定获取IP 5、XShell连接CentO 准备工作&#xff1a;提前下载和安装好VMware。VMware的安装可以参考这一篇文章&#xff1a;VMware15的下载及安装教程。 1、CentOS7的下载 …

sentinel整合nacos配置中心持久化

在网上找了很多的资料&#xff0c;发现sentinel整合nacos持久化的博文和视频大多数都只有改造限流部分的教程&#xff0c;并且都需要修改前端&#xff0c;略显麻烦&#xff0c;至于剩下的熔断、热点流控、授权的更是没有相关的改造教程&#xff0c;最后在知乎的看到一篇文章后让…

Sql server数据库数据查询

请查询学生信息表的所有记录。 答&#xff1a;查询所需的代码如下&#xff1a; USE 学生管理数据库 GO SELECT * FROM 学生信息表 执行结果如下&#xff1a; 查询学生的学号、姓名和性别。 答&#xff1a;查询所需的代码如下&#xff1a; USE 学生管理数据库 GO SELE…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑移动式储能调度的配电网灾后多源协同孤岛运行策略》

这篇文章的标题表明研究的主题是在配电网发生灾害后&#xff0c;采用一种策略来实现多源协同孤岛运行&#xff0c;并在这个过程中特别考虑了移动式储能的调度。 让我们逐步解读标题的关键词&#xff1a; 考虑移动式储能调度&#xff1a; 文章关注的焦点之一是移动式储能系统的…

持续集成交付CICD:Jenkins流水线实现Nexus制品晋级策略

目录 一、理论 1.开发测试运维环境 二、实验 1.Nexus制品晋级策略 一、理论 1.开发测试运维环境 &#xff08;1&#xff09;环境 1&#xff09;持续集成开发环境&#xff08;DEV: Development Environment&#xff09; 直接通过源代码编译打包&#xff0c;其会跑单元测试…

Vue之数据绑定

在我们Vue当中有两种数据绑定的方法 1.单向绑定 2.双向绑定 让我为大家介绍一下吧&#xff01; 1、单向绑定(v-bind) 数据只能从data流向页面 举个例子&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…

Docker Compose(容器编排)——9

目录 什么是 Docker Compose生活案例为什么要 Docker ComposeDocker Compose 的安装Docker Compose 的功能Docker Compose 使用场景Docker Compose 文件&#xff08;docker-compose.yml&#xff09; 文件语法版本文件基本结构及常见指令Docker Compose 命令清单 命令清单如下命…

Java项目-瑞吉外卖Day4

实现文件的上传下载&#xff1a; 前端代码&#xff1a; 对文件的操作就是对流的操作。 上传文件的后端代码&#xff0c;需要注意MultipartFile的名字必须与前端相对&#xff1a; 为文件存储位置进行动态设置&#xff0c;配置application.xml 在CommonController中设置属性读…

【Python网络爬虫入门教程2】成为“Spider Man”的第二课:观察目标网站、代码编写

Python 网络爬虫入门&#xff1a;Spider man的第二课 写在最前面观察目标网站代码编写 第二课总结 写在最前面 有位粉丝希望学习网络爬虫的实战技巧&#xff0c;想尝试搭建自己的爬虫环境&#xff0c;从网上抓取数据。 前面有写一篇博客分享&#xff0c;但是内容感觉太浅显了…

【Linux】使用Bash和GNU Parallel并行解压缩文件

介绍 在本教程中&#xff0c;我们将学习如何使用Bash脚本和GNU Parallel实现高效并行解压缩多个文件。这种方法在处理大量文件时可以显著加快提取过程。 先决条件 确保系统上已安装以下内容&#xff1a; BashGNU Parallel 你可以使用以下命令在不同Linux系统上安装它们&am…

深入理解希尔排序

基本思想 希尔排序(Shells Sort)是插入排序的一种又称“缩小增量排序”&#xff08;Diminishing Increment Sort&#xff09;&#xff0c;是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。 对于n个待排序的数列&#xff0c;取一个小于n的整数gap(gap被…

Shell 常用命令详解-上

Shell 常用命令详解-上 1.目录查阅相关命令2.文件操作相关命令 1.目录查阅相关命令 ll 命令 命令描述&#xff1a;ll命令用于显示指定工作目录下的内容。 命令格式&#xff1a;ll [参数] [目录名]。 参数说明&#xff1a; 参数说明-a显示所有文件及目录&#xff08;包括隐藏文…

基于JavaWeb+SSM+Vue助农扶贫微信小程序系统的设计和实现

基于JavaWebSSMVue助农扶贫微信小程序系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图 源码获取入口 Lun文目录 目 录 第一章 绪论 1 1.1 研究背景 1 1.2 研究意义 1 1.3 研究内容 2 第二章 开发环境与技术 3 2.1 JSP技术 3 2.2 MySQL数据库 3 2.3 Java…

探索无监督域自适应,释放语言模型的力量:基于检索增强的情境学习实现知识迁移...

深度学习自然语言处理 原创作者: Xnhyacinth 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;如何有效地进行无监督域自适应(Unsupervised Domain Adaptation, UDA) 一直是研究的热点和挑战。无监督域自适应的目标是在目标域无标签的情况下&#xff0c;将源域的知识…

排序算法---选择排序

1.实现流程&#xff1a; 1. 把第一个没有排序过的元素设置为最小值&#xff1b; 2. 遍历每个没有排序过的元素&#xff1b; 3. 如果元素 < 现在的最小值&#xff1b; 4. 将此元素设置成为新的最小值&#xff1b; 5. 将最小值和第一个没有排序过的位置交换 选择排序执行流程…

数据分析基础之《numpy(2)—ndarray属性》

一、ndarray的属性 1、属性方法 属性名字属性解释ndarray.shape数组维度的元组&#xff08;形状&#xff09;ndarray.ndim数组维数ndarray.size数组中的元素数量ndarray.itemsize一个数组元素的长度&#xff08;字节&#xff09;ndarray.dtype数组元素的类型使用方法 数组名.…

AS安装目录

编辑器&#xff1a; sdk: gradle: gradle使用的jdk目录&#xff1a;Gradle使用的jdk是android studio安装目录下的jbr 成功项目的android studio配置&#xff1a;

从Centos-7升级到Centos-Stream-8

如果在正式环境升级&#xff0c;请做好数据备份以及重要配置备份&#xff01;因为升级会造一部分应用被卸载。 注意&#xff1a;升级前请备份好数据&#xff0c;升级可能会导致ssh的root用户无法登陆、网卡名称发生改变、引导丢失无法开机等问题。 1.安装epel源 yum -y install…