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.rhkb.cn/news/89180.html

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

相关文章

适配器模式:将不兼容的接口转换为可兼容的接口

适配器模式&#xff1a;将不兼容的接口转换为可兼容的接口 什么是适配器模式&#xff1f; 适配器模式是一种结构型设计模式&#xff0c;用于将一个类的接口转换为客户端所期望的另一个接口。它允许不兼容的类能够合作&#xff0c;使得原本由于接口不匹配而无法工作的类能够一…

IDEA常用设置与maven项目部署

目录 前言 一、Idea是什么 二、Idea的优点 三、Idea的常用设置 主题设置 设置鼠标悬浮提示 忽略大小写提示 自动导包 取消单行显示Tabs 设置字体 配置类文档注释信息模版 设置文件编码 设置自动编译 水平或者垂直显示代码 快捷方式改成eclipse 设置默认浏览器…

SCSS的基本用法

1、声明变量 $ 声明变量的符号 $ 下面这张图左半部分是scss的语法&#xff0c;右半部分是编译后的css。&#xff08;整篇文章皆是如此&#xff09; 2、默认变量 !default sass 的默认变量仅需要在值后面加上 !default 即可。 如果分配给变量的值后面添加了 !default 标志…

HDMI接口的PCB布局布线要求

高清多媒体接口&#xff08;High Definition Multimedia Interface&#xff09;&#xff0c;简称&#xff1a;HDMI&#xff0c;是一种全数字化视频和声音发送接口&#xff0c;可以发送未压缩的音频及视频信号。随着技术的不断提升&#xff0c;HDMI的传输速率也不断的提升&#…

Qt5开发视频播放器

一、播放器界面UI设计 控件对象名位置&#xff08;坐标点&#xff09;对象名称组件名称备注Widget(0, 0, 809, 572)WidgetQWidgetlabellabelQLabel播放窗口label_2label_2QLabelvoice_controlvoice_controlQSlider音量滑动条btn_openbtn_openQPushButton打开文件按钮label_4la…

CSDN热榜分析:来看看热榜都在写什么

文章目录 数据爬取词云制作滤除停用词 数据爬取 热榜地址是https://blog.csdn.net/rank/list&#xff0c;先进去再说 from selenium import webdriver from selenium.webdriver.common.by import By url https://blog.csdn.net/rank/list driver webdriver.Edge() driver.g…

Python批量给excel文件加密

有时候我们需要定期给公司外部发邮件&#xff0c;在自动化发邮件的时候需要对文件进行加密传输。本文和你一起来探索用python给单个文件和批量文件加密。    python自动化发邮件可参考【干货】用Python每天定时发送监控邮件。 文章目录 一、安装pypiwin32包二、定义给excel加…

SQL | 汇总数据

9-汇总数据 9.1-聚集函数 在实际开发过程中&#xff0c;可能会遇到下面这些情况&#xff1a; 确定大于某个值的有多少行数据&#xff0c;比如游戏排行榜&#xff0c;查询玩家排行多少名。 获取表中某些行的和&#xff0c;比如双十一当天&#xff0c;某个用户总订单价格是多少…

开源,微信小程序 美食便签地图(FoodNoteMap)的设计与开发

目录 0 前言 1 美食便签地图简介 2 美食便签地图小程序端开发 2.1技术选型 2.2前端UI设计 2.3主页界面 2.4个人信息界面 2.5 添加美食界面 2.6美食便签界面 2.8 美食好友界面 2.9 美食圈子界面 2.10 子页面-店铺详情界面 2.11 后台数据缓存 2.12 订阅消息通知 2.1…

SpringBoot第36讲:SpringBoot集成连接池 - 集成数据库Druid连接池

SpringBoot第36讲&#xff1a;SpringBoot集成连接池 - 集成数据库Druid连接池 上文介绍默认数据库连接池HikariCP&#xff0c;本文是SpringBoot第36讲&#xff0c;主要介绍SpringBoot集成阿里开源的Druid连接池的实践; 客观的来说&#xff0c;阿里Druid只能说是中文开源中 功能…

excel填数据转json格式

定制化比较严重&#xff0c;按需更改 excel文件如下 代码 # -*- coding: utf-8 -*- import oss2 import shutil import sys import xlwt import xlrd import json from datetime import datetime, timedeltafile1 "C:\\Users\\cxy\\Desktop\\generate.xls" #打开表…

OCP China Day 2023:五大社区齐聚,加速开源开放创新与落地

8月10日&#xff0c;2023年开放计算中国社区技术峰会&#xff08;OCP China Day 2023&#xff09;在北京举行。智慧时代&#xff0c;计算多元化、应用多样化、技术复杂化正驱动数据中心新一轮变革&#xff0c;开源开放社区已成为推动数据中心持续创新的重要力量&#xff0c;通过…

多线程与高并发--------线程池

线程池 一、什么是线程池 在开发中&#xff0c;为了提升效率的操作&#xff0c;我们需要将一些业务采用多线程的方式去执行。 比如有一个比较大的任务&#xff0c;可以将任务分成几块&#xff0c;分别交给几个线程去执行&#xff0c;最终做一个汇总就可以了。 比如做业务操…

Maven进阶2 -- 私服(Nexus)、私服仓库分类、资源上传和下载

目录 私服是一台独立的服务器&#xff0c;用于解决团队内部的资源共享与资源同步问题。 1.Nexus Nexus是sonatype公司的一款maven私服产品。 下载地址 启动 nexus.exe /run nexus 访问 & 登录 2.私服仓库分类 3.资源上传和下载 本地仓库上传和访问资源需要进行配置。…

SpingBoot-Vue前后端——实现CRUD

目录​​​​​​​ 一、实例需求 ⚽ 二、代码实现 &#x1f3cc; 数据库 &#x1f440; 后端实现 &#x1f4eb; 前端实现 &#x1f331; 三、源码下载 &#x1f44b; 一、实例需求 ⚽ 实现一个简单的CRUD&#xff0c;包含前后端交互。 二、代码实现 &#x1f3cc; 数…

Java SPI机制

Java SPI机制 java的spi就是一种服务提供发现机制&#xff0c;在一方制定好接口规范后&#xff0c;通过spi的机制可以它的子实现类进行服务发现&#xff0c;以及加载它的子实现类&#xff0c;通过这种机制&#xff0c;让我们在引入第三方库时&#xff0c;不用讲第三方库中的类…

管易云和金蝶云星空接口打通对接实战

管易云和金蝶云星空接口打通对接实战 对接系统管易云 管易云是上海管易云计算软件有限公司旗下的专注提供电商企业管理软件服务的品牌&#xff0c;总部位于中国上海张江高科技产业园区。管易云旗下拥有管易云C-ERP、EC-OMS、EC-WMS、B2C/B2B/BBC/微商城开发、PDA无纸化仓储解决…

TypeScript项目中Axios的封装

目录 前言 一、axios中的常见类型 1. AxiosInstance 2. AxiosRequestConfig 3. AxiosResponse 4. AxiosError 二、axios封装步骤 三、封装后的完整代码 1. 基础封装 2. 高级封装 前言 为了实现统一的网络请求处理和管理&#xff0c;在日常开发中我们常常封装 axios&…

一个步骤跳过 Unity 启动Logo | 多平台适用 | 官方API支持

前言【Unity实战篇 】 | 一个步骤跳过 Unity Logo 界面 | 多平台适用 | 官方API支持使用方法核心 API1. RuntimeInitializeOnLoadMethodAttribute2. SplashScreen效果展示总结前言 众所周知,使用Unity引擎打包的工程在启动时都带有Unity的默认启动Logo。这个问题可以通过购买U…

Codeforces Round 893 (Div. 2)ABC

Codeforces Round 892 (Div. 2) 目录 A. United We Stand题目大意思路代码 B. Olya and Game with Arrays题目大意思路代码 C. Another Permutation Problem题目大意思路代码 A. United We Stand 题目大意 给你一个数组&#xff0c;把这个数组分成两个数组a和b&#xff0c;使…