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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三个月从零入门深度学习,保姆级学习路线图!

小伙伴们大家好&#xff0c;这里是长沙图灵教育&#xff0c;我们从2001年开始进入教育行业&#xff0c;立足泛IT类职业教育&#xff0c;以打造新兴高新技术人才为宗旨&#xff0c;致力于成为优质的职业教育内容提供商;于2017年正式成立图灵&#xff0c; 在线教育有限公司。 到…

测试开发探索:“WeTalk“网页聊天室的测试流程与自动化

目录 引言&#xff1a; 测试开发目标&#xff1a; "WeTalk"项目背景 关于登录测试用例的设计 测试开发策略与流程 集成测试&#xff1a;Selenium JUnit 接口测试&#xff1a;Postman 测试用例的设计与实现 自动化测试演示&#xff1a; 用例一&#xff1a;登…

多线程进阶

多线程进阶 本章博客主要是围绕一些多线程相关的面试题&#xff0c;讨论的内容都是往年同学遇到的原题&#xff0c;以后面试也大概率会遇到的&#xff01;&#xff01;&#xff01; 常见的锁策略 锁策略指的不是某个具体的锁&#xff0c;是一个抽象的概念&#xff0c;描述的…

使用cloud-int部署nginx

参考 azure创建虚拟机,创建虚拟机注意入站端口规则开放80端口&#xff0c;高级中使用自定义数据&#xff0c;初始化虚拟机&#xff0c;安装nginx 连接CLI&#xff0c;验证是否安装成功 访问虚拟机IP查看是否部署成功 参考文档&#xff1a; https://learn.microsoft.com/zh-cn…

11款UML/SysML建模工具更新(2023.7)Papyrus、UModel……

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 最近一段时间更新的工具有&#xff1a; 工具最新版本&#xff1a;drawio-desktop 21.6.5 更新时间&#xff1a;2023年7月22日 工具简介 开源绘图工具&#xff0c;用Electron编写&#xff0c;…

Skeleton-Aware Networks for Deep Motion Retargeting

Skeleton-Aware Networks for Deep Motion Retargeting解析 摘要1. 简介2. Related Work2.1 运动重定向&#xff08;Motion Retargeting&#xff09;2.2 Neural Motion Processing 3. 概述&#xff08;Overview&#xff09;4. 骨骼感知深度运动处理4.1 运动表征4.2 骨架卷积4.3…

23、springboot日志使用入门-- SLF4J+Logback 实现(springboot默认的日志实现),日志打印到控制台及日志输出到指定文件

springboot日志使用入门 ★ 典型的Spring Boot日志依赖&#xff1a; spring-boot-start.jar -- spring-boot-starter-logging.jar (Spring Boot的日志包&#xff09;-- logback&#xff08;core、classic&#xff09;-- log4j-to-slf4j.jar-- jul-to-slf4j.jar就是springboo…

IntentService

1. IntentService Android专门提供了一个异步的、自动停止的IntentService类。使用和普通的Service非常像&#xff0c;可以通过startService(Intent)通过Intent来提交请求&#xff0c;完成所有的任务后自己关闭。&#xff08;请求是在工作线程处理的&#xff09;好处&#xff…

[足式机器人]Part4 机械设计 Ch00/01 绪论+机器结构组成与连接 ——【课程笔记】

本文仅供学习使用 本文参考&#xff1a; 《机械设计》 王德伦 马雅丽课件与日常作业可登录网址 http://edu.bell-lab.com/manage/#/login&#xff0c;选择观摩登录&#xff0c;查看2023机械设计2。 机械设计-Ch00Ch01——绪论机器结构组成与连接 Ch00-绪论0.1 何为机械设计——…

Redisson实现锁以及redis缓存一致性问题

目录 RedissonClient实现最基本的锁 RedissonClient实现读写锁 RedissonClient实现闭锁 RedissonClient信号量 缓存不一致问题解决方案 一、双写模式 二、失效模式 RedissonClient实现最基本的锁 // 1、获取一把锁&#xff0c;只要锁的名字一样&#xff0c;就是同一把锁R…

redis分布式集群-redis+keepalived+ haproxy

redis分布式集群架构&#xff08;RedisKeepalivedHaproxy&#xff09;至少需要3台服务器、6个节点&#xff0c;一台服务器2个节点。 redis分布式集群架构中的每台服务器都使用六个端口来实现多路复用&#xff0c;最终实现主从热备、负载均衡、秒级切换的目标。 redis分布式集…

【EI复现】一种建筑集成光储系统规划运行综合优化方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Beats:使用 Filebeat 将 golang 应用程序记录到 Elasticsearch - 8.x

毫无疑问&#xff0c;日志记录是任何应用程序最重要的方面之一。 当事情出错时&#xff08;而且确实会出错&#xff09;&#xff0c;我们需要知道发生了什么。 为了实现这一目标&#xff0c;我们可以设置 Filebeat 从我们的 golang 应用程序收集日志&#xff0c;然后将它们发送…

SCSS的基本用法

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

Clickhouse基于文件复制写入

背景 目前clickhouse社区对于数据的写入主要基于文件本地表、分布式表方式为主&#xff0c;但缺乏大批量快速写入场景下的数据写入方式&#xff0c;本文提供了一种基于clickhouse local 客户端工具分布式处理hdfs数据表文件&#xff0c;并将clickhouse以文件复制的方式完成写入…

【Rust】Rust学习 第十一章编写自动化测试

Rust 是一个相当注重正确性的编程语言&#xff0c;不过正确性是一个难以证明的复杂主题。Rust 的类型系统在此问题上下了很大的功夫&#xff0c;不过它不可能捕获所有种类的错误。为此&#xff0c;Rust 也在语言本身包含了编写软件测试的支持。 编写一个叫做 add_two 的将传递…

Jsoup爬取简单信息

1. 豆瓣图书最受关注 1.1 创建SpringBoot项目或者Maven项目 1.2 引入jsoup <dependency><!-- jsoup HTML parser library https://jsoup.org/ --><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.3<…

MySQL_约束、多表关系

约束 概念&#xff1a;就是用来作用表中字段的规则&#xff0c;用于限制存储在表中的数据。 目的&#xff1a;保证数据库中数据的正确性&#xff0c;有效性和完整性。 约束演示 #定义一个学生表&#xff0c;表中要求如下&#xff1a; #sn 表示学生学号&#xff0c;要求使用 …

开源可商业运营的ChatGpt网页源码v1.2.2

&#x1f916; 主要功能 后台管理系统,可对用户,Token,商品,卡密等进行管理 精心设计的 UI&#xff0c;响应式设计 极快的首屏加载速度&#xff08;~100kb&#xff09; 支持Midjourney绘画和DALLE模型绘画,GPT4等应用 海量的内置 prompt 列表&#xff0c;来自中文和英文 一键导…

【C++】vector容器

0.前言 1.vector构造函数 #include <iostream> using namespace std; #include <vector>void printVector(vector<int>& v) //此处&代表 引用 &#xff1b;若取地址&#xff0c;则是 数据类型* 变量名 {for (vector<int>::iterator it v.begi…