2022-03-05:不相交的线。 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直
2022-03-05:不相交的线。
在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。
现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足:
nums1[i] == nums2[j]
且绘制的直线不与任何其他连线(非水平线)相交。
请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。
以这种方法绘制线条,并返回可以绘制的最大连线数。
输入:nums1 = [1,4,2], nums2 = [1,2,4]。
输出:2。
解释:可以画出两条不交叉的线,如上图所示。
但无法画出第三条不相交的直线,因为从 nums1[1]=4 到 nums2[2]=4 的直线将与从 nums1[2]=2 到 nums2[1]=2 的直线相交。
力扣1035。
答案2022-03-05:
求最长公共子序列。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
if true {
A := []int{1, 4, 2}
B := []int{1, 2, 4}
ret := maxUncrossedLines1(A, B)
fmt.Println(ret)
}
if true {
A := []int{1, 4, 2}
B := []int{1, 2, 4}
ret := maxUncrossedLines2(A, B)
fmt.Println(ret)
}
}
// 针对这个题的题意,做的动态规划
func maxUncrossedLines1(A, B []int) int {
if len(A) == 0 || len(B) == 0 {
return 0
}
N := len(A)
M := len(B)
// dp[i][j]代表: A[0...i]对应B[0...j]最多能划几条线
dp := make([][]int, N)
for i := 0; i < N; i++ {
dp[i] = make([]int, M)
}
if A[0] == B[0] {
dp[0][0] = 1
}
for j := 1; j < M; j++ {
dp[0][j] = twoSelectOne(A[0] == B[j], 1, dp[0][j-1])
}
for i := 1; i < N; i++ {
dp[i][0] = twoSelectOne(A[i] == B[0], 1, dp[i-1][0])
}
// 某个值(key),上次在A中出现的位置(value)
AvalueLastIndex := make(map[int]int)
AvalueLastIndex[A[0]] = 0
// 某个值(key),上次在B中出现的位置(value)
BvalueLastIndex := make(map[int]int)
for i := 1; i < N; i++ {
AvalueLastIndex[A[i]] = i
BvalueLastIndex[B[0]] = 0
for j := 1; j < M; j++ {
BvalueLastIndex[B[j]] = j
// 可能性1,就是不让A[i]去划线
p1 := dp[i-1][j]
// 可能性2,就是不让B[j]去划线
p2 := dp[i][j-1]
// 可能性3,就是要让A[i]去划线,那么如果A[i]==5,它跟谁划线?
// 贪心的点:一定是在B[0...j]中,尽量靠右侧的5
p3 := 0
if _, ok := BvalueLastIndex[A[i]]; ok {
last := BvalueLastIndex[A[i]]
p3 = twoSelectOne(last > 0, dp[i-1][last-1], 0) + 1
}
// 可能性4,就是要让B[j]去划线,那么如果B[j]==7,它跟谁划线?
// 贪心的点:一定是在A[0...i]中,尽量靠右侧的7
p4 := 0
if _, ok := AvalueLastIndex[B[j]]; ok {
last := AvalueLastIndex[B[j]]
p4 = twoSelectOne(last > 0, dp[last-1][j-1], 0) + 1
}
dp[i][j] = getMax(getMax(p1, p2), getMax(p3, p4))
}
BvalueLastIndex = make(map[int]int)
}
return dp[N-1][M-1]
}
// 但是其实这个题,不就是求两个数组的最长公共子序列吗?
func maxUncrossedLines2(A, B []int) int {
if len(A) == 0 || len(B) == 0 {
return 0
}
N := len(A)
M := len(B)
dp := make([][]int, N)
for i := 0; i < N; i++ {
dp[i] = make([]int, M)
}
dp[0][0] = twoSelectOne(A[0] == B[0], 1, 0)
for j := 1; j < M; j++ {
dp[0][j] = twoSelectOne(A[0] == B[j], 1, dp[0][j-1])
}
for i := 1; i < N; i++ {
dp[i][0] = twoSelectOne(A[i] == B[0], 1, dp[i-1][0])
}
for i := 1; i < N; i++ {
for j := 1; j < M; j++ {
p1 := dp[i-1][j]
p2 := dp[i][j-1]
p3 := twoSelectOne(A[i] == B[j], 1+dp[i-1][j-1], 0)
dp[i][j] = getMax(p1, getMax(p2, p3))
}
}
return dp[N-1][M-1]
}
func twoSelectOne(c bool, a, b int) int {
if c {
return a
} else {
return b
}
}
func getMax(a, b int) int {
if a > b {
return a
} else {
return b
}
}
执行结果如下:

2022-03-05:不相交的线。 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直的更多相关文章
- [Swift]LeetCode1035.不相交的线 | Uncrossed Lines
We write the integers of A and B (in the order they are given) on two separate horizontal lines. Now ...
- C++内存布局(1)-让new出的两个变量在堆上的地址连续
大家都知道栈的地址按照从高到低的顺序增长的, 而堆的地址是按照从底到高的顺序增长的. ); ); cout<<"n1,n2所指的地址:" << n1 < ...
- [笔试题]黑板上写下50个数字,选两个黑板上数字a和b,在黑板写|b-a|,剩下的数字?
在黑板上写下50个数字:1至50.在接下来的49轮操作中,每次做如下操作:选取两个黑板上的数字a和b,擦去,在黑板上写|b-a|.请问最后一次动作之后剩下的数字可能是什么?为什么?(不用写代码,不写原 ...
- apache启用gzip压缩方法--转载自http://www.cnblogs.com/linzhenjie/archive/2013/03/05/2943635.html
一.gzip介绍 Gzip是一种流行的文件压缩算法,现在的应用十分广泛,尤其是在Linux平台.当应用Gzip压缩到一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小.这取决于文件中 ...
- 记一个线上问题,selectById查询id出现两条数据问题
查询selectById(),查询1529665444035670017(Long)结果出现两条数据: id:1529665444035670017,和id:1529665444035670018 调 ...
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全 Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...
- 求空间内两条直线的最近距离以及最近点的坐标(C++)
关键词:空间几何 用途:总有地方会用到吧 文章类型:C++函数展示 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-19 @Lab: CvLab20 ...
- c编程:求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。
//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max, ...
- POJ1269:Intersecting Lines(判断两条直线的关系)
题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点 ...
- 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数
今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...
随机推荐
- linux查看已知进程PID所在的目录
pwdx 命令 pwdx PID [was@CMTRMWAS1 ~]$ pwdx 31996 31996: /was/AppServer/profiles/AppSrv03
- celery介绍安装以及基本使用步骤
目录 一.关于celery 二.celery架构的构成 1 任务中间件 Broker, 2 任务执行单元 worker 3 结果存储 backend 三.celery的应用场景 1. 异步执行:解决耗 ...
- 痞子衡嵌入式:MCUBootUtility v2.3.1发布,解决了长久以来非空flash可能无法下载的问题
-- 痞子衡维护的NXP-MCUBootUtility工具距离上一个版本(v2.3)发布过去3个月了,这一次痞子衡为大家带来了小版本升级v2.3.1(第一次做x.y.z中z级别更新),这个版本主要有两 ...
- Python学习笔记--图像的进一步学习
演示地图的可视化的实现 示例: 设置全局选项 可以设置出不同的颜色,不会显得很干巴: 国内地图: 那么,我们应当如何找到相对应的颜色的编号呢? 基本步骤: 前往ab173.com网站 然后在,前端那里 ...
- Moebius兼容AlwaysOn
背景 数据库是信息化的基石,支撑着整个业务系统,发挥着非常重要的作用,被喻为"IT的心脏".因此,让数据库安全.稳定.高效地运行已经成为IT管理者必须要面对的问题.数据库在底层架构 ...
- 几个对js帮助挺多的大佬写的博客
深入理解javascript原型和闭包(完结) JavaScript系列文章 同步异步回调DEMO知乎大佬的this与new解释 宏任务与微任务解析 js闭包 Vue项目中技巧ts学习 ES6基础入门 ...
- python实现员工信息表
学习python时,看到的一个题目第一次写博客, 有误的地方还请大佬们指正,十分感谢~要求如下'''文件存储格式如下:id,name,age,phone,job(这行不需要写)1,alice,22,1 ...
- 运输问题和指派问题—R实现
运输问题和指派问题 运输问题经常出现在计划货物配送和从某些供给地区到达需求地区之间的服务中,特别是每个供给地区(起点)的货物可获得量是有限的,每个需求地区(目的地)的货物需求量是已知的.运输问题中最常 ...
- 痞子衡嵌入式:利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设. 关于 i.MXRT1xxx 系列芯片 BootROM 中集成的 ...
- [软件工程]TO B型IT软件企业在工程管理角度所存在的诸多问题
组织架构与分工? 各子组织的职责.边界是否明确? (安装.升级)部署规范? 必须有部署文档. 各个模块/组件部署在哪台服务器?哪个路径下? 一切非正式启用的任务.文件(夹).安装资料必须依据实际用途以 ...