DAY20

news2025/1/16 18:54:49

题目一

一个字符串 最少分隔几个部分 让它全都是回文字符串

做一个dp[][]数组  dp[i][j] 表示i....j位置上的字符串是否为回文字符串 依赖于dp[i+1][j-1] 也就是左边界缩一个格子 右边界缩一个格子 

basecase 对角线 dp[i][i]只有一个字符 必为回文

 最后一列 倒数第二行的格子 也就是对角线右边的一条线 依赖左下的话 是空的 所以一次填两条斜线万无一失

第二条斜线也好办 就两个元素 相等为回文 不等为非回文

然后填好每个格子 除了一条斜线一条斜线的填 我们也可以从下往上填 每一行的开始点都是行+2 因为本来是行=列开始的 从图中我们也可以看出 每行都填好了两个格子

额 这样我们就生成好了一张表 来看每一个区域是不是回文

 

然后在来一个一维的dp数组

dp[i]位置表示 i...结尾位置最少分隔几个成为回文字符串

然后我们枚举i 就是i为开头 然后在每个i中 枚举每个结尾 就相当于枚举每个子数组了 不过为啥不枚举结尾呢 一定要从后往前枚举开头呢

dp[i]是i...结尾位置最少分隔几个成为回文字符串的话 dp1[end+1]是 这个结尾的

这个MAX_VaLUE这一步很关键 因为最开始都是0 没填过的格子会被min识别成有效且最小的

 当i...end为回文的时候 我们就要考虑 要不要切这么一刀 当前位置的分隔次数肯定是 它分隔前的次数+1刀 因为是吧i...end这个区间作为一个新的区间 但是呢 这一刀也不一定要

比如说 abakfk     i==5 的时候 

dp[5] MAX和0+1 哪个更小 dp[5] = 1

i==4的时候

从end==4开始结算  MAX和 1+1 选择2 这种每次都是+1的选择是最坏的可能性 我上一个格子的分隔区间 直接加一(我自身独立成一个格子) 接下来的每种走法 都是看能不能和之前的格子连接上 形成回文了 如果可以形成回文 也不一定是当前区间最长就是最小的 可能是 5长度 1 长度 1长度 1长度 四个区间 而4长度 三长度 两个区间才是最优解 所以要遍历每一个可能的区间 然后往回推 看看到底算上当前区间要分几个区间

如果是分割次数 那就是分割区间减一喽

public int  minCut(String s) {
		 if (s == null || s.length() == 0) {
			return 0;
		}
		if (s.length() == 1) {
			return 0;
		}
      char [] chars = s.toCharArray();
      int N = chars.length;
      boolean [][] dp = new boolean [N][N];
      for(int i = 0;i<N;i++) {
    	  dp[i][i] = true;
      }
      for(int i = 0;i<N-1;i++) {
    	  if(chars[i]==chars[i+1]) {
    		  dp[i][i+1] = true;
    	  }
      }
      for (int row = N - 3; row >= 0; row--) {
			for (int col = row + 2; col < N; col++) {//开始的两列填完了
				dp[row][col] = chars[row] == chars[col] && dp[row + 1][col - 1];
			}
		}
      int[] dp1 = new int[N + 1];
		for (int i = 0; i <= N; i++) {
			dp1[i] = Integer.MAX_VALUE;
		}
		dp1[N] = 0;
		for (int i = N - 1; i >= 0; i--) {
			for (int end = i; end < N; end++) {
				// i..end
				if (dp[i][end]) {
					dp1[i] = Math.min(dp1[i], 1 + dp1[end + 1]);
				}
			}
		}
		return dp1[0]-1;
	}

 

力扣链接-力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

 

 

题目二 

给定两个有序数组arr1和arr2,再给定一个正数K
求两个数累加和最大的前K个,两个数必须分别来自arr1和arr2 可以重复使用数 但是同一个组合只能使用一次
 

额 做一张二维表 里面有所有数的累加和 dp[i][j]为 arr1 i位置+arr2 j位置的和 

然后再有一张同样格式的表

然后做一个大根堆 大根堆最大容量为K 先把右下角的放进去 右下角一定是最大的 然后看这个值的上面和左面哪个值大 把它放入堆中 因为它是一个有序数组 两个数组都取最大的值 肯定是最大的 左侧和上侧 分别代表 arr1取倒数第二个和arr2取倒数第一个  arr1取倒数第一个和arr2取倒数第二个 看看他俩哪个大 然后把它放在堆中 然后再看它的左侧和上侧 wrong 两个都放进去 如果超额的放了 那么 它是一个大根堆 会把大的放在前面 然后只取较大的

记得不要重复加入 like this

 

这个D点就是重复加入了 by the way 这个B点 A点 一定分别大于CD和ED 这个倒是没问题 但是当C大于E 且只要五个元素的情况呢 我们会先加入最开始的星 弹出星 +B +A 然后弹出B +E +D 然后弹出A +D +C 每次加入两个元素 我担心的 还没加入本层元素 就收集完毕的情况不存在 收集元素到第N层的时候 外面那层已经加入完毕了并参与排序了  假如说我们A B为第二层 我们收集元素肯定是在第二层 在第二层收集完成之前 不会进入下一层 而当前层收集一遍的时候 就把所有下一层元素加进去了

 public static int [] TopKsum(int [] arr1,int [] arr2,int K) {
if (arr1 == null || arr2 == null || K < 1) {
			return null;
		}
		// arr1 50  arr2 20   1000   topk 100万
		K = Math.min(K, arr1.length * arr2.length);
	 int length1 = arr1.length;
	 int length2 = arr2.length;
     int cur1 = length1-1;
     int cur2 = length2-1;
     PriorityQueue<Node> stack = new PriorityQueue<Node>(new mycompare());
     stack.add(new Node(cur1, cur2, arr1[cur1]+arr2[cur2]));
     int count = 0;
     int [] res = new int [K];
     boolean [][] isin = new boolean[arr1.length][arr2.length];
     while(count<=K) {
    	 /*res[count] = stack.poll().value;
    	 count++;
    	 if(cur1-1>=0&&isin[cur1-1][cur2]==false) {
    		 cur1--;
    		 stack.add(new Node(cur1, cur2, arr1[cur1]+arr2[cur2]));
    		 isin[cur1][cur2] = true;
    	 }
    	 if(cur2-1>=0&&isin[cur1][cur2-1]==false) {
    		 cur2--;
    		 stack.add(new Node(cur1, cur2, arr1[cur1]+arr2[cur2]));
    		 isin[cur1][cur2] = true;  这么做不对 逻辑就错了 每次只能走两个 只针对第一次循环是正确的
    	 }*/
    	 Node node = stack.poll();
    	 res[count] = node.value;
    	 count++;
    	 cur1 = node.i1;
    	 cur2 = node.i2;
    	 if(cur1-1>=0&&isin[cur1-1][cur2]==false) {
    		 cur1--;
    		 stack.add(new Node(cur1, cur2, arr1[cur1]+arr2[cur2]));
    		 isin[cur1][cur2] = true;
    	 }
    	 if(cur2-1>=0&&isin[cur1][cur2-1]==false) {
    		 cur2--;
    		 stack.add(new Node(cur1, cur2, arr1[cur1]+arr2[cur2]));
    		 isin[cur1][cur2] = true;
    	 
     }
     }
     return res;
     
	}

记得洗一下参数 如果拢共笛卡尔积都没有K那么多 那就不用找那么多

第三题

给定一个正数数组arr,返回该数组能不能分成4个部分,并且每个部分的累加
和相等,切分位置的数不要。
例如:
arr=[3, 2,4, 1,4,9, 5, 10,1, 2, 2]返回true三个切割点下标为2, 5, 7.切出的四个子数组为[3,2]. [1,4]. [5], [1,2,2],累加和都是5

首先 如果它长度不大于等于七 就是白给

然后我们的思路是枚举每一刀的位置

首先第一刀 1....N-6上面选 再后面就凑不齐三刀了

假设我们第一刀的位置为a 那么a的前缀和为x 

那么第二刀的位置它的前缀和一定是2x+a

第三刀的前缀和一定是 3x+a+b

然后剩下的 也得是x

那就得做个累加和预处理数组了 然后遍历每个位置

或者我们主动出击 做个hashmap 看看需要多少累加和 那就直接找到

 public static boolean canSplits(int[] arr) {
		 if (arr.length<7) {
			return false;
		}
	HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
	int sum = arr[0];
	for (int i = 1; i < arr.length; i++) {
		map.put(sum, i);
		sum += arr[i];
	}
	int lsum = arr[0]; // 第一刀左侧的累加和 就是x拉
	for (int s1 = 1; s1 < arr.length - 5; s1++) { // s1是第一刀的位置
		int checkSum = lsum * 2 + arr[s1]; // 100 x 100   100*2 + x
		if (map.containsKey(checkSum)) {
			int s2 = map.get(checkSum); // j -> y
			checkSum += lsum + arr[s2];
			if (map.containsKey(checkSum)) { // 100 * 3 + x + y
				int s3 = map.get(checkSum); // k -> z
				if (checkSum + arr[s3] + lsum == sum) {
					return true;
				}
			}
		}
		lsum += arr[s1];
	}
	return false;
     
	}

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

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

相关文章

SpringBoot案例-部门管理-修改

目录 前言 查看页面原型&#xff0c;明确需求 页面原型 需求 阅读接口文件 思路分析 功能接口开发 控制层&#xff08;Controller类&#xff09; 业务层&#xff08;Service类&#xff09; 业务类 业务实现类 持久层&#xff08;Mapper类&#xff09; 接口测试 前…

网络编程小项目-tftp下载

tftp下载模型 TFTP通信过程总结 服务器在69号端口等待客户端的请求服务器若批准此请求&#xff0c;则使用 临时端口 与客户端进行通信。每个数据包的编号都有变化&#xff08;从1开始&#xff09;每个数据包都要得到ACK的确认&#xff0c;如果出现超时&#xff0c;则需要重新发…

Ubuntu 连接海康智能相机步骤(亲测,成功读码)

ubuntu20.04下连接海康智能相机 Ubuntu 连接海康智能相机步骤(亲测&#xff0c;已成功读码)输出的结果 Ubuntu 连接海康智能相机步骤(亲测&#xff0c;已成功读码) (就是按照海康的提供的步骤和源码连接相机&#xff0c;流水账) 安装Ubuntu20.04安装gcc和g&#xff0c;IDmvs只…

746.使用最小花费爬楼梯

class Solution {public int minCostClimbingStairs(int[] cost) {int[] dp new int[cost.length];dp[0] cost[0];dp[1] cost[1];for(int i2;i<cost.length;i){dp[i] Math.min(dp[i-1],dp[i-2])cost[i];}return Math.min(dp[cost.length-1],dp[cost.length-2]);} } 经典…

你知道什么是电商私域吗?

电商私域是当前电子商务领域中的一个热门概念&#xff0c;它指的是电商平台和商家之间建立起的用户亲密关系&#xff0c;通过运用品牌内容和数据等方式&#xff0c;通过私域流量的运营和管理&#xff0c;实现用户精细化运营和增长。 在过去&#xff0c;电商平台主要依赖于流量…

Delphi7通过VB6之COM对象调用FreeBASIC写的DLL功能

VB6写ActiveX COM组件比较方便&#xff0c;不仅PowerBASIC与VB6兼容性好&#xff0c;Delphi7与VB6兼容性也不错&#xff0c;但二者与FreeBASIC兼容性在字符串处理上差距比较大&#xff0c;FreeBASIC是C化的语言&#xff0c;可直接使用C指令。下面还是以实现MKI/CVI, MKL/CVL, M…

LinuxC编程——进程间通信(一)(管道)

目录 一、Linux平台通信方式发展史二、进程间通信方式⭐⭐⭐三、无名管道3.1 特点⭐⭐⭐3.2 函数pipe3.3 注意事项⭐⭐⭐3.4 练习 四、有名管道4.1 特点⭐⭐⭐4.2 函数 mkfifo4.3 注意事项⭐⭐4.4 练习 五、无名管道与有名管道对比⭐⭐ 复杂的编程环境通常使用多个相关的进程来…

【周末闲谈】人工智能热潮下的AIGC到底指的是什么?

生成式人工智能AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;是人工智能1.0时代进入2.0时代的重要标志。 个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一…

HTML5 基础标签

目录 前言 标题标签 段落标签 换行标签和水平线标签 文本格式化标签 图像标签 超链接标签 多媒体标签 列表标签 无序列表 有序列表 表格 合并单元格 表单 无语义的布局标签 字符实体 前言 当今互联网时代&#xff0c;网页是我们获取信息、交流和展示自己的重要渠…

【SpringBoot学习笔记】04. Thymeleaf模板引擎

模板引擎 所有的html元素都可以被thymeleaf替换接管 th:元素名 templates下的只能通过Controller来跳转&#xff0c;templates前后端分离&#xff0c;需要模板引擎thymeleaf支持 模板引擎的作用就是我们来写一个页面模板&#xff0c;比如有些值呢&#xff0c;是动态的&#x…

Leetcode-每日一题【剑指 Offer 27. 二叉树的镜像】

题目 请完成一个函数&#xff0c;输入一个二叉树&#xff0c;该函数输出它的镜像。 例如输入&#xff1a; 4 / \ 2 7 / \ / \ 1 3 6 9 镜像输出&#xff1a; 4 / \ 7 2 / \ / \ 9 6 3 1 示例 1&#xff1a; 输入&#xff1a;root [4,2,…

实验二十六、RC桥式正弦波振荡电路参数选择

一、题目 电路如图1所示。利用 Multisim 分析下列问题&#xff1a; &#xff08;1&#xff09;选择合适的 R f R_f Rf​ 和稳压管&#xff0c;使电路产生正弦波振荡&#xff0c;并观察起振过程&#xff1b; &#xff08;2&#xff09;调整电路参数&#xff0c;使输出电压峰值…

2. 获取自己CSDN文章列表并按质量分由小到大排序(文章质量分、博客质量分、博文质量分)(阿里云API认证)

文章目录 写在前面步骤打开CSDN质量分页面粘贴查询文章url按F12打开调试工具&#xff0c;点击Network&#xff0c;点击清空按钮点击查询是调了这个接口https://bizapi.csdn.net/trends/api/v1/get-article-score用postman测试调用这个接口&#xff08;不行&#xff0c;认证不通…

Linux 基础篇(六)sudo和添加信任用户

一、sudo 1.是什么&#xff1f; 给被信任的普通用户授权&#xff0c;让被信任的普通用户能执行root用户才能执行的命令的一个命令。 2.为什么&#xff1f; 很多时候我们要在被信任的普通用户下执行一些root用户才能执行的命令&#xff0c;如 yum… 所以需要有一个命令能给普通用…

阿里云预装LAMP应用导致MySQL不显示访问密码如何解决

&#x1f600;前言 本篇博文是关于阿里云云服务器ECS部署MySQL过程中出现的一下坑&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家…

[静态时序分析简明教程(九)]多周期路径set_multicycle_path

静态时序分析简明教程-多周期路径 一、写在前面1.1 快速导航链接 二、多周期路径2.1 多周期路径的SDC命令2.2 路径常规约束2.3 建立/保持规格2.4 位移量2.5 多时钟周期案例 三、总结 一、写在前面 一个数字芯片工程师的核心竞争力是什么&#xff1f;不同的工程师可能给出不同的…

C语言 字符指针

1、介绍 概念&#xff1a; 字符指针&#xff0c;就是字符类型的指针&#xff0c;同整型指针&#xff0c;指针指向的元素表示整型一样&#xff0c;字符指针指向的元素表示的是字符。 假设&#xff1a; char ch a;char * pc &ch; pc 就是字符指针变量&#xff0c;字符指…

群晖安装wireguard(群晖7.1)

前言 上篇文章介绍了乌班图如何安装wireguard&#xff0c;但是感觉虚拟机安装有损优雅性。 本期视频我们介绍使用群晖安装wireguard。 由于原来黑群晖内核版本太低了。 我这里升级到群晖dns918&#xff08;7.1版本&#xff09; 内核版本为4.4 实际上这仍然不满足wireguar…

知识图谱基本工具Neo4j使用笔记 四 :使用csv文件批量导入图谱数据

文章目录 一、系统说明二、说明三、简单介绍1. 相关代码以及参数2. 简单示例 四、实际数据实践1. 前期准备&#xff08;1&#xff09; 创建一个用于测试的neo4j数据库&#xff08;2&#xff09;启动neo4j 查看数据库 2. 实践&#xff08;1&#xff09; OK 上面完成后&#xff0…

【多模态】25、ViLT | 轻量级多模态预训练模型(ICML2021)

文章目录 一、背景二、ViLT 方法三、效果3.1 数据集3.2 分类任务 VQA 和 NLVR23.3 Image Retrieval 论文&#xff1a;ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision 代码&#xff1a;https://github.com/dandelin/vilt 出处&#xff1a;…