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,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...
随机推荐
- UGUI六大基础组件——Graphic Raycaster
一.组件作用 图形摄像投射器是用于检测UI输入事件的射线发射器.通过射线检测玩家和用户的交互,判断是否点击到了UI元素. 注意:不是通过碰撞器来检测的,而是通过图形来检测的. 二.参数解释 ***** ...
- python requests 上传文件_python3使用requests上传文件,content-type踩的坑
通常提交普通表单时,requests的post方法可以指定headers,所以我在使用requests模拟上传文件行为时,直接按照下面的方式写了: 然后服务器就报出了找不到分隔符Invalid mul ...
- layui使用OSS上传
1.首先要把aliyun-oss-sdk.js包下载下来,放到指定的目录下面 在要用的页面引入或者在index.html入口文件全局引入: <script src="util/ali ...
- springboot条件注册Condition注解
环境识别 import org.springframework.context.annotation.Condition; import org.springframework.context.ann ...
- uniapp微信小程序解析详情页的四种方法
一.用微信文档提供的RICH-TEXT 官方文档:微信文档rich-text 这种是直接使用: <!-->content是API获取的html代码</--> <rich- ...
- 我们为什么要阅读webpack源码
相信很多人都有这个疑问,为什么要阅读源码,仅仅只是一个打包工具,会用不就行了,一些配置项在官网,或者谷歌查一查不就好了吗,诚然在大部分的时候是这样的,但这样在深入时也会遇到以下几种问题. webpac ...
- Cocos 引擎生态部负责人李阳:己之所欲,可施于人,希望通过生态促进国内引擎技术发展
前言 "小小的身体,大大的能量,这个应该是我对大表姐最直接的感觉,在她娇小的身躯里蕴含了无限的精力和潜力,很像漫威里的神奇女侠,作为一个具备冒险精神的非典型程序员,大表姐热爱的体育活动都是很 ...
- Java面试——消息队列
一.消息队列的使用场景 ☞ 以下介绍消息队列在实际应用常用的使用场景.异步处理.应用解耦.流量削锋和消息通讯四个场景.[1]异步处理:场景说明:用户注册后,需要发注册邮件和注册短信. 引入消息队列后 ...
- WordPress回复/评论本文可见
给WordPress添加一个实用的小功能,那就是回复可见,评论文章才能见到隐藏内容. 在主题目录下找到functions.php文件,在合适位置添加下方的代码: // 回复可见 function re ...
- 搞一个自己用的node-cli
我们都用过 vue 的cli ,或者 react的cli, 亦或是其他的cli 如 vite 等.他们都是提供了一个全局命令,然后在终端执行这个全局命令就可以创建出模板项目.今天我们就自己做一个,给 ...