DAY21

news2024/11/26 19:37:04

题目一

给定三个字符串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] == 1
		for (int i = 1; i != arr.length; i++) {
			if (arr[i] > range + 1) {
				return range + 1;
			} else {
				range += arr[i];
			}
		}
		return range + 1;
	}

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

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

相关文章

ESP32-连接参数/间隔更新

连接间隔的设置是一个协商的过程&#xff0c;ESP32提供了一些协商的接口&#xff0c;按顺序分析一下。 Step 1&#xff1a;首先是Client连接时对Server要求的连接间隔&#xff08;确定值&#xff09; 在连接的时候&#xff0c;Client会把当前的连接间隔发送给Server。在Serve…

Vue.js2+Cesium1.103.0 十一、Three.js 炸裂效果

Vue.js2Cesium1.103.0 十一、Three.js 炸裂效果 Demo ThreeModelBoom.vue <template><div:id"id"class"three_container"/> </template><script> /* eslint-disable eqeqeq */ /* eslint-disable no-unused-vars */ /* eslint-d…

物流行业数据分析

文章目录 物流行业数据分析一、数据预处理1、数据清洗① 重复值、缺失值、格式调整② 异常值处理 2、数据规整 二、 数据分析1、配送服务是否存在问题2、是否存在尚有潜力的销售区域3、商品是否存在质量问题 三、总结参考 物流行业数据分析 Excel适合处理低量级数据&#xff0…

【Hystrix技术指南】(7)故障切换的运作流程原理分析(含源码)

背景介绍 目前对于一些非核心操作&#xff0c;如增减库存后保存操作日志发送异步消息时&#xff08;具体业务流程&#xff09;&#xff0c;一旦出现MQ服务异常时&#xff0c;会导致接口响应超时&#xff0c;因此可以考虑对非核心操作引入服务降级、服务隔离。 Hystrix说明 官方…

解决Idea 多模块,maven项目是多层级文件夹的子项时无法加入git管理的问题

问题 多模块项目&#xff0c;引入模块无法做git管理&#xff0c;第一个项目没有git分支标志&#xff0c;也不能像其他项目一样右键出git选项。 解决方法 发现该模块是多层级的文件夹结构&#xff0c;也就是项目本身在一个文件夹下。应该是要管理该文件夹。 Settings-Versi…

python使用装饰器记录方法耗时

思路 python使用修饰器记录方法耗时&#xff0c;目的是每当方法执行完后&#xff0c;可以记录该方法耗时&#xff0c;而不需要在每个方法的执行前后&#xff0c;去创建一个临时变量&#xff0c;来记录耗时。 方式一&#xff08;不推荐&#xff09;&#xff1a; 在每个方法的…

【java面向对象中static关键字】

提纲 static修饰成员变量static修饰成员变量的应用场景static修饰成员方法static修饰成员方法的应用场景static的注意事项static的应用知识&#xff1a;代码块static的应用知识&#xff1a;单例设计模式 static静态的意思&#xff0c;可以修饰成员变量&#xff0c;成员方法&a…

AbstractQueuedSynchronizer

目录 AQS是什么AQS什么样内部类成员变量方法public如果不使用AQS会怎样 AQS的应用ReentrantLockSyncNonfairSyncFairSync 其他实现 AQS是什么 AbstractQueuedSynchronizer&#xff08;AQS&#xff09;是Java中的一个并发工具&#xff0c;位于java.util.concurrent.locks包中&a…

最新Ubuntu LVGL SDL模拟器安装

前言 本文主要说明Ubuntu 23.4安装LVGL 9.0以及基于SDL的模拟环境。 代码下载 访问lv_port_pc_eclipse可以看到相信信息&#xff0c;官方已经打包好了整个代码环境。 安装CMAKE。 sudo apt install cmake安装SDL。 sudo apt-get update && sudo apt-get install …

HTML(JavaEE初级系列12)

目录 前言&#xff1a; 1.HTML结构 1.1认识HTML标签 1.2HTML文件基本结构 1.3标签层次结构 1.4快速生成代码框架 2.HTML常见标签 2.1注释标签 2.2标题标签&#xff1a;h1-h6 2.3段落标签&#xff1a;p 2.4换行标签&#xff1a; br 2.5格式化标签 2.6图片标签&#…

新手家长必读:英国ISEB考试局CEO为低龄留学家庭深度解析ISEB

大家都知道&#xff0c;英国私校备考难就难在流程繁琐&#xff0c;菁英私校笔面试风格各异&#xff0c;考试时间各不相同。但在进入私校笔面试之前&#xff0c;还有非常重要的一步——通过ISEB pre-test考试。      作为英校申请敲门砖&#xff0c;学生在注册之后&#xff…

STM32 F103C8T6学习笔记7:双机无线串口通信

今日尝试配通俩个C8T6单片机之间的无线串口通信&#xff0c;文章提供原理&#xff0c;源码&#xff0c;测试效果图&#xff0c;测试工程下载&#xff1a; 目录 传输不规范问题&#xff1a; 串口通信资源&#xff1a; 单个串口资源理解&#xff1a; 单片机串口资源&#xf…

ModaHub魔搭社区:Milvus Cloud向量数据库不可小觑

向量数据库不可小觑 事实上,向量数据库并不是一个新的数据库技术,只是一直以来并没有什么亮眼的技术突破,因此显得有点“籍籍无名”。然而,当向量检索找到典型应用场景,成为普遍需求后,向量数据库的真正价值才日益凸显。 云和恩墨创始人,中国数据库联盟(ACDU) 主席盖…

[ Docker ] 部署 nps 和 npc 实现内网穿透

nps 原作者已停止维护&#xff0c;现在用 yisier1/nps 云主机上运行 nps 创建目录 mkdir -p /root/docker/nps mkdir /root/repo下载必要文件 Docker 镜像 docker pull yisier1/npsGit 仓库 git clone https://github.com/yisier/nps.git /root/repo cp -r /root/repo/nps…

【密码学】维京密码

维京密码 瑞典罗特布鲁纳巨石上的图案看起来毫无意义&#xff0c;但是它确实是一种维京密码。如果我们注意到每组图案中长笔画和短笔画的数量&#xff0c;将得到一组数字2、4、2、3、3、5、2、3、3、6、3、5。组合配对得到24、23、35、23、36、35。现在考虑如图1.4所示的内容&a…

yolov5部署 单线程与多线程对比

单线程 部署代码可参考&#xff1a; Yolov5 ONNX Runtime 的 C部署_爱钓鱼的歪猴的博客-CSDN博客 main.cpp #include "detector.h" #include <chrono> using namespace std;// 识别线程 void *detect_thread_entry(void *para){}int main(int argc, char *ar…

分布式应用:Zabbix监控MariaDB

目录 一、理论 1.Zabbix监控MariaDB 二、实验 1.Zabbix监控MariaDB 一、理论 1.Zabbix监控MariaDB &#xff08;1&#xff09;环境 zabbix服务端&#xff1a;192.168.204.214 zabbix客户端&#xff1a;192.168.204.215 &#xff08;2&#xff09;MareaDB安装 安装 za…

文献阅读:AnnoLLM: Making Large Language Models to Be Better Crowdsourced Annotators

文献阅读&#xff1a;AnnoLLM: Making Large Language Models to Be Better Crowdsourced Annotators 1. 文章简介2. 方法介绍3. 实验考察 1. 实验结果2. 消解实验3. Consistency & Stability 4. 结论 & 思考 文献链接&#xff1a;https://arxiv.org/abs/2303.16854 …

STM32F429IGT6使用CubeMX配置SPI通信(W25Q256芯片)

1、硬件电路 需要系统性的看一下W25Q256芯片手册 2、设置RCC&#xff0c;选择高速外部时钟HSE,时钟设置为180MHz 3、配置SPI 4、生成工程配置 5、相关代码 #define sFLASH_ID 0XEF4019 // W25Q256#define SPI_FLASH_PageSize 256 #define SPI_FLASH_PerWritePageSize 256#def…

爬虫小白-如何辨别请求头referer/origin反爬

目录 一、网站分析二、最终代码一、网站分析 1、网站,研究这块数据从哪个接口来的 2、反爬参数:请求头referer/origin校验和x-api-key 3、详细分析流程,看b站十一姐时一视频, 或者知识星球时光漫漫图文文章 二、最终代码 # -*- coding: utf-8 -*- # @Time : 2023-08-13