DAY21

题目一

给定三个字符串str1、str2和aim, 如果aim包含且仅包含来自str1和str2的所有字符,而且在aim中属于str1的字符 之间保持原来在str1中的顺序,属于str2的字符之间保持原来在str2中的顺序,那么称aim是str1和str2的交错组成。实现一个函数,判断aim是 否是str1和str2交错组成
[举例] str1="AB", str2="12"。 那么"AB12"、"A1B2"、 "A12B"、 "1A2B"和"1AB2"等都是str1和str2的交错组成
 

双指针法只能用在没有重复值的情况 如果有重复值 双指针法就不再适用了

首先如果长度不一致的话 aim!=str1+str2的时候 直接过滤掉

dp[i][j] 是str1 0....i和str2 0....j 能否交错组成aim 0.....i+j

basecase的话 第一行还算好找 第一列也是  

经典字符串考虑 不要的情况 dp[0]位置全是str1一个字符都不要 不过这么做之后确实简单了不少 要不basecase就够喝一壶了

所以 相等就是可以 不等就是不行

然后dp[i][j]依赖于 它的前一个格子和上一个格子

就是你新加入了一个字符 那么我们就看这个新加的字符和aim对应位置的字符是否相同

因为是交错组成 假如说前面已经是两个字符串交错组成而来的话那我们只需要看最新的位置

if(s3.length()!=s1.length()+s2.length()) {return false;}char [] aim = s3.toCharArray();char [] chars1 = s1.toCharArray();char [] chars2 = s2.toCharArray();int length1 = chars1.length;int length2 = chars2.length;boolean [][] dp = new boolean [length1+1][length2+1];dp[0][0] = true;for(int i = 1;i<=length1;i++) {if(chars1[i-1]!=aim[i-1]) {break;}dp[i][0] = true;  }for(int i = 1;i<=length2;i++) {if(chars2[i-1]!=aim[i-1]) {break;}dp[0][i] = true;  }for(int i = 1;i<=length1;i++) {for(int j = 1;j<=length2;j++) {if ((chars1[i - 1] == aim[i + j - 1] && dp[i - 1][j])|| (chars2[j - 1] == aim[i + j - 1] && dp[i][j - 1])) {dp[i][j] = true;}}}return dp[length1][length2];}

题目二

给定一个无序数组arr.如果只能再一个子数组上排序 返回如果让arr整体有序,需要排序的最短子数组长度
无论中间的有序数组有多长 边上有元素无序都不行 所以我们看两侧不用排的有多少 

public static int [] getMinLength(int[] arr) {if (arr == null || arr.length < 2) {return new int [] {-1,-1};}int N = arr.length;int leftno = -1;int max = arr[0];int righton = -1;int min = arr[N-1];for(int i = 1;i<N;i++) {if(max > arr[i]) {leftno = i-1;break;}max = arr[i];}for(int i = N-2;i>=0;i--) {if(min<arr[i]) {righton = i+1;break;}min = arr[i];}return new int [] {leftno,righton};}

我刚开始是这么写的 但是只是两边有序是不行的 例如 1,2,3...... 1,2,3  这样的 就是错的  

从后往前找 找到最前面一个无序的 从前往后找 找最后一个无序的 这样才对 这样找出来的才是最边上的无序的

第三题

读题都得读一会 

要注意我们要求的是整个数组的最小组成和 不是某个子数组的不可组成和 只要一个子数组可以组成 那么整体就可以组成

做一个dp数组 dp[i][j] 表示数组0...i的累加和能否得到j

啊 填第一列 肯定能 我一个不要 不就是累加和0

dp[i][j]  它依赖于dp[i-1][j-arr[i]]  如果只用i-1个元素 就能凑出j-arr[i]的话 那么我们再加上一个元素 就能凑出j

或者 dp[i-1][j] 如果四个元素都能推出j 那五个元素也能推出 我不要新的元素不就得了

所以这个格子的位置是 可不可以推出 而不是等不等于

可以有可以的推法被 可以是包含等于的 所以我们又有了个依赖dp[i-1][j]

既然我有 0....i了 那我就可以凑出任何一个位置的 累加和可不可以得到某个值(其实用不上 只要最后一行 所有元素都要能推出什么值)

然后我们拿最后一行 也就是说我们用所有元素 可以推出什么不可以推出什么

啊 所以最开始我们求sum的时候把min和一起求了 后面还有用(max不用求 就是sum)

public static int  unformedSum(int[] arr) {if (arr == null || arr.length == 0) {return 1;}int N = arr.length;int Min = Integer.MAX_VALUE;int sum = 0;for (int i : arr) {Min = Math.min(Min,i);sum+=i;}boolean [][] dp = new boolean [N][sum+1];for(int i = 1;i<N;i++) {dp[i][0] = true;}for(int i = 0;i<N;i++) {for(int j = 1;j<sum+1;j++) {dp[i][j] = dp[i-1][j]||((j-arr[i]>=0)?dp[i-1][j-arr[i]]:false);}}for (int j = min; j <= sum; j++) {if (!dp[N - 1][j]) {return j;}}return sum + 1;}

那么升级版的问题怎么解

整数数组永远包含1 也就是最小不可组成和永远要从2开始算

先把整个数组从小到大排序

定义一个变量 range 含义是1.....range的数都可求

a是一个遍历数组的指针

如果a<=range+1

那么就 range = range+a 举个例子 a = 5 range = 20 也就是说range<=20的所有数都能求出来 那么就必然存在 20+5 19+5 18+5 +17+5 让它把21到25填好

如果a>range+1

a = 50; range = 30  50>31 前面的一堆玩意都凑不出来31 你比31还大 那更凑不出来了 第一个出现的大于就是最小不可求

为啥是range+1 当a==range+1 的时候  假如说a = 5 range = 4 这个时候  9完全可以通过之前的方式得出 如果a要是再大一点呢 6 a = 6 range仍等于4 那么4通过累加就无法得到5了 他们就缺了 这个东西本质是要求 range的最大范围要和a是相邻的 才能严格的推出每一个值

4 5 相邻 中间没有真空期是前面的累加不出来 加上后面的更累加不出来 range后面这个数 要一个数加上a才能累加出来 如果a本身就比这个大 那家多少都累加不出来

public static int unformedSum3(int[] arr) {if (arr == null || arr.length == 0) {return 0;}Arrays.sort(arr); // O (N * logN)int range = 1;// arr[0] == 1for (int i = 1; i != arr.length; i++) {if (arr[i] > range + 1) {return range + 1;} else {range += arr[i];}}return range + 1;}

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

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

相关文章

Springboot-Retrofit HTTP工具框架快速使用

在SpringBoot项目直接使用okhttp、httpClient或者RestTemplate发起HTTP请求&#xff0c;既繁琐又不方便统一管理。 因此&#xff0c;在这里推荐一个适用于SpringBoot项目的轻量级HTTP客户端框架retrofit-spring-boot-starter&#xff0c;使用非常简单方便&#xff0c;同时又提供…

约数个数(质因子分解)

思路&#xff1a; &#xff08;1&#xff09;由数论基本定理&#xff0c;任何一个正整数x都能写作&#xff0c;其中p1,p2..pk为x的质因子。 &#xff08;2&#xff09;由此可以推断&#xff0c;要求一个数约数的个数&#xff0c;注意到约数就是p1,p2...pk的一种组合&#xff…

日常BUG—— SpringBoot项目DEBUG模式启动慢、卡死。

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 我们调试程序时&#xff0c;需要使用DEBUG模式启动SpringBoot项目&#xff0c; 有时候会发…

SQL | 使用通配符进行过滤

6-使用通配符进行过滤 6.1-LIKE操作符 前面介绍的所有操作符都是通过已知的值进行过滤&#xff0c;或者检查某个范围的值。但是如果我们想要查找产品名字中含有bag的数据&#xff0c;就不能使用前面那种过滤情况。 利用通配符&#xff0c;可以创建比较特定数据的搜索模式。 …

c++ 有元

友元分为两部分内容 友元函数友元类 友元函数 问题&#xff1a;当我们尝试去重载operator<<&#xff0c;然后发现没办法将operator<<重载成成员函数。因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作 数了。…

基于dbn+svr的交通流量预测,dbn详细原理

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) DBN+SVR的交通流量预测 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,是一种非常好的分类算法,本文将DBN+SVR用于交通流量预测…

二叉树题目:二叉树的直径

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树的直径 出处&#xff1a;543. 二叉树的直径 难度 3 级 题目描述 要求 给定二叉树的根结点 root \texttt{root} root&#xff0c;返回其直径…

考研408 | 【计算机网络】 传输层

导图 传输层的功能 传输层的两个协议 传输层的寻址与端口 UDP协议 UDP的主要特点 UDP首部格式&#xff1a; UDP校验&#xff1a; TCP协议 TCP协议的特点 TCP报文段首部格式 TCP连接管理 TCP的连接建立 SYN洪泛攻击 TCP的连接释放 TCP可靠传输 序号&#xff1a; 确认&#xff1…

ASEMI快恢复二极管APT80DQ20BG怎么检查好坏

编辑-Z 二极管APT80DQ20BG是一种高压快恢复二极管&#xff0c;常用于电源和电能质量控制等领域。如果您的二极管出现故障或需要进行维修&#xff0c;以下是一些可能的解决方案。 首先&#xff0c;确保您已经断开了电源&#xff0c;并且具备基本的电子维修知识和技能。如果您不…

添加vue devtools扩展工具+添加后F12不显示Vue图标

前言&#xff1a;在开启Vue学习之旅时&#xff0c;遇到问题两个问题&#xff0c;第一添加不上vue devtools扩展工具&#xff0c;第二添加完成后&#xff0c;F12不显示Vue图标。查阅了很多博客&#xff0c;自己解决了问题&#xff0c;故写此博客记录。如果你遇到和我一样的问题&…

React源码解析18(3)------ beginWork的工作流程【mount】

摘要 OK&#xff0c;经过上一篇文章。我们调用了&#xff1a; const root document.querySelector(#root); ReactDOM.createRoot(root)生成了FilberRootNode和HostRootFilber。 并且二者之间的对应关系也已经确定。 而下一步我们就需要调用render方法来讲react元素挂载在ro…

【JavaEE进阶】SpringBoot 日志

文章目录 一. 日志有什么用?二. 自定义日志打印1. 日志的使用与打印 三. 日志级别1. 日志级别有什么用?2. 日志级别的分类及使用 四. 日志持久化五. 更简单的日志输出---Lombok1. Lombok的使用2. lombok原理解释2.1 Lombok更多注解说明 一. 日志有什么用? 在Java中&#xf…

【gogogo专栏】指针

go语言指针 为什么需要指针指针使用实例值传递地址传递多级指针 为什么需要指针 作为一个大学划水&#xff0c;毕业一直写java的程序员来说&#xff0c;多多少少对于指针有点陌生&#xff0c;由于近期需要转go&#xff0c;正好学到指针这里&#xff0c;就来探究下指针的使用场景…

ThreadLocal详解

ThreadLocal详解 一、故事背景二、知识点主要构成1、什么是ThreadLocal&#xff1f;2、ThreadLocal的基本使用内存泄漏问题引用类型&#xff1a;强引用&#xff1a;软引用弱引用虚引用 ThreadLocal内存泄漏原因 三、总结提升 一、故事背景 最近在学习并发编程相关内容&#xf…

Es、kibana安装教程-ES(二)

上篇文章介绍了ES负责数据存储&#xff0c;计算和搜索&#xff0c;他与传统数据库不同&#xff0c;是基于倒排索引来解决问题的。Kibana是es可视化工具。 分布式搜索ElasticSearch-ES&#xff08;一&#xff09; 一、ElasticSearch安装 官网下载地址&#xff1a;https://www…

[C语言] 指针

1. 指针是什么 2. 指针和指针类型 3. 野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 目录 1. 指针是什么&#xff1f; 2. 指针和指针类型 2.1 指针-整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 4. 指针运算 4.1 指针…

不用技术代码,分班查询系统怎么做?

暑假即将结束&#xff0c;新学期开始将面临分班信息公布的工作&#xff01;对于分班信息公布&#xff0c;涉及到学生的个人信息&#xff0c;包括姓名、学号、班级等。在发布这些信息时&#xff0c;必须确保数据的保密性&#xff0c;防止未经授权的人员获取到学生的个人信息。因…

docker的服务/容器缺少vim问题

背景/问题&#xff1a; docker的服务/容器缺少vim问题 bash: vim: command not found 在docker的mysql服务中安装Vim 1、执行apt-get update root6d8d17e320a0:/# apt-get update问题:文件下载失败 Err:1 http://security.debian.org/debian-security buster/updates InRe…

【Linux】程序地址空间

程序地址空间 首先引入地址空间的作用什么是地址空间为什么要有地址空间 首先引入地址空间的作用 1 #include <stdio.h>2 #include <unistd.h>3 #include <stdlib.h>4 int g_val 100;6 int main()7 {8 pid_t id fork();9 if(id 0)10 {11 int cn…

自动方向识别式 LSF型电平转换芯片

大家好&#xff0c;这里是大话硬件。 今天这篇文章想分享一下电平转换芯片相关的内容。 其实在之前的文章分享过一篇关于电平转换芯片的相关内容&#xff0c;具体可以看链接《高速电路逻辑电平转换设计》。当时这篇文章也是分析的电平转换芯片&#xff0c;不过那时候更多的是…