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

目录

一、单词拆分 

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

双指针-三数之和

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-ifor(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.mzph.cn/news/213656.shtml

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

相关文章

Terraform实战(二)-terraform创建阿里云资源

1 初始化环境 1.1 创建初始文件夹 $ cd /data $ mkdir terraform $ mkdir aliyun terraform作为terraform的配置文件夹&#xff0c;内部的每一个.tf&#xff0c;.tfvars文件都会被加载。 1.2 配置provider 创建providers.tf文件&#xff0c;配置provider依赖。 provider…

想学编程,但不知道从哪里学起,应该怎么办?

怎样学习任何一种编程语言 我将教你怎样学习任何一种你将来可能要学习的编程语言。本书的章节是基于我和很多程序员学习编程的经历组织的&#xff0c;下面是我通常遵循的流程。 1&#xff0e;找到关于这种编程语言的书或介绍性读物。 2&#xff0e;通读这本书&#xff0c;把…

基于Java Swing泡泡龙游戏(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

AP9111手电筒专用集成电路芯片 单节干电池 LED手电筒IC

概述 AP9111 是 LED 手电筒专用集成电路芯片 &#xff0c;是一款采用大规模集成电路技术&#xff0c;专门针对单节干电池的 LED 手电筒设计的一款专用集成电路。外加 1 个电感元件&#xff0c;即可构成 LED 手电筒驱动电路板。AP 9111 性能优越、可靠性高、使用简单、生产一致…

六级高频词汇3

目录 单词 参考链接 单词 400. nonsense n. 胡说&#xff0c;冒失的行动 401. nuclear a. 核子的&#xff0c;核能的 402. nucleus n. 核 403. retail n. /v. /ad. 零售 404. retain vt. 保留&#xff0c;保持 405. restrict vt. 限制&#xff0c;约束 406. sponsor n. …

聊个开心的敏捷话题——40小时工作制

近年来&#xff0c;加班现象在很多行业已经普遍制度化&#xff0c;甚至“996”已成为一些行业标签。企业高强度的压榨让员工不堪重负&#xff0c;且时常由此引发的各种悲剧也并不鲜见。 所以&#xff0c;今天我们一起来聊一个开心轻松的话题——极限编程的40h工作制原则。 40…

【环境搭建】ubuntu22安装ros2

基于某种特殊需求&#xff0c;从Ubuntu16到22目前都尝试过安装ros、ros2 参考1&#xff1a;http://t.csdnimg.cn/DzvSe 参考2&#xff1a;http://t.csdnimg.cn/sOzr1 1.设置locale sudo apt update && sudo apt install locales sudo locale-gen en_US en_US.UTF-8 s…

Spring的IOC容器初始化流程

Spring的IOC容器初始化流程 IOC容器初始化在SpringApplication对象创建完毕执行run方法时执行refreshContext()时开始。 准备BeanFactory&#xff0c;设置其类加载器和environment等 执行BeanFactory后置处理器&#xff0c;扫描要放入容器的Bean信息&#xff0c;得到对应的Bea…

阿里云服务器租用价格分享,阿里云服务器热门配置最新活动价格汇总

在我们购买阿里云服务器的时候&#xff0c;1核2G、2核2G、2核4G、2核8G、4核8G、8核16G、8核32G等配置属于用户购买最多的热门配置&#xff0c;1核2G、2核2G、2核4G这些配置低一点的云服务器基本上能够满足绝大部分个人建站和普通企业用户建站需求&#xff0c;而4核8G、8核16G、…

Maven项目引入本地jar

Maven项目引入本地jar 1.对应maven模块项目中建lib目录&#xff0c;将jar放入进去 2.在对应的模块pom.xml中引入此依赖jar 3.在对应的maven-plugin插件打包的pom.xml中指定需要includeSystemScope为true的jar

AMEYA360:大唐恩智浦荣获 2023芯向亦庄 “汽车芯片50强”

2023年11月28日&#xff0c;由北京市科学技术委员会和北京市经济和信息化局指导、北京经济技术开发区管理委员会主办、盖世汽车协办的“芯向亦庄”汽车芯片大赛在北京亦庄成功闭幕。 在本次大赛中 大唐恩智浦的 电池管理芯片DNB1168 (应用于新能源汽车BMS系统) 凭卓越的性能及高…

【SpringBoot教程】SpringBoot 实现前后端分离的跨域访问(CORS)

作者简介&#xff1a;大家好&#xff0c;我是撸代码的羊驼&#xff0c;前阿里巴巴架构师&#xff0c;现某互联网公司CTO 联系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗…

【毕业季|进击的技术er】作为一名职场人,精心总结的嵌入式学习路线图

活动地址&#xff1a;毕业季进击的技术er 文章目录 0、作者介绍1、前言2、嵌入式基础必备知识2.1、学习内容2.2、学习建议2.3、学习资料 3、嵌入式入门篇——51单片机3.1、学习内容3.2、学习建议3.3、学习资料 4、STM32进阶篇4.1、学习内容4.2、学习建议4.3、学习资料 5、小而美…

嵌入式开发按怎样的路线学习较好?

嵌入式开发按怎样的路线学习较好&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「嵌入式从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&…

张驰咨询:掌握流程改进的关键,深入了解六西格玛绿带培训

尊敬的读者&#xff0c;当您寻求提升个人能力&#xff0c;加强企业流程管理时&#xff0c;六西格玛绿带培训无疑是您的不二选择。本文将带您深入了解六西格玛绿带培训的核心内容、必备工具和实际案例&#xff0c;以助您在职业生涯中一帆风顺。 六西格玛绿带培训主要针对中层管…

论文查重怎么找到需要更改的【详细说明】

大家好&#xff0c;今天来聊聊论文查重怎么找到需要更改的&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 论文查重怎么找到需要更改的 论文查重是保证学术诚信和提高论文质量的重要环节小发猫伪原创。…

班级管理的重要性

班级管理&#xff0c;就像是一座桥&#xff0c;连接着学生和老师&#xff0c;它的重要性不言而喻。 营造良好的学习氛围 班级管理不仅仅是维护秩序&#xff0c;更是营造一个积极向上的学习氛围。一个好的班级管理&#xff0c;能让学生更加专注于学习&#xff0c;提高学习效率。…

Linux上的MAC地址欺骗

Linux上的MAC地址欺骗 1、查看mac地址法1&#xff1a;ifconfig法2&#xff1a;ip link show 2、临时性改变 MAC 地址法1&#xff1a;使用iproute2工具包法2&#xff1a;使用macchanger工具 3、永久性改变 MAC 地址3.1 在 Fedora、RHEL下实践3.2 在 Debian、Ubuntu、Linux Mint下…

数据结构之----原码、反码、补码

数据结构之----原码、反码、补码 什么是原码&#xff1f; 原码&#xff1a;我们将数字的二进制表示的最高位视为符号位&#xff0c;其中 0 表示正数&#xff0c;1 表示负数&#xff0c;其余位表示数字 的值。 什么是反码&#xff1f; 反码&#xff1a;正数的反码与其原码相…

网络攻击(二)--情报搜集阶段

4.1. 概述 在情报收集阶段&#xff0c;你需要采用各种可能的方法来收集将要攻击的客户组织的所有信息&#xff0c;包括使用社交网络、Google Hacking技术、目标系统踩点等等。 而作为渗透测试者&#xff0c;你最为重要的一项技能就是对目标系统的探查能力&#xff0c;包括获知…