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
}
}

执行结果如下:


左神java代码

2022-03-05:不相交的线。 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直的更多相关文章

  1. [Swift]LeetCode1035.不相交的线 | Uncrossed Lines

    We write the integers of A and B (in the order they are given) on two separate horizontal lines. Now ...

  2. C++内存布局(1)-让new出的两个变量在堆上的地址连续

    大家都知道栈的地址按照从高到低的顺序增长的, 而堆的地址是按照从底到高的顺序增长的. ); ); cout<<"n1,n2所指的地址:" << n1 < ...

  3. [笔试题]黑板上写下50个数字,选两个黑板上数字a和b,在黑板写|b-a|,剩下的数字?

    在黑板上写下50个数字:1至50.在接下来的49轮操作中,每次做如下操作:选取两个黑板上的数字a和b,擦去,在黑板上写|b-a|.请问最后一次动作之后剩下的数字可能是什么?为什么?(不用写代码,不写原 ...

  4. apache启用gzip压缩方法--转载自http://www.cnblogs.com/linzhenjie/archive/2013/03/05/2943635.html

    一.gzip介绍 Gzip是一种流行的文件压缩算法,现在的应用十分广泛,尤其是在Linux平台.当应用Gzip压缩到一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小.这取决于文件中 ...

  5. 记一个线上问题,selectById查询id出现两条数据问题

    查询selectById(),查询1529665444035670017(Long)结果出现两条数据: id:1529665444035670017,和id:1529665444035670018 调 ...

  6. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  7. 求空间内两条直线的最近距离以及最近点的坐标(C++)

    关键词:空间几何 用途:总有地方会用到吧 文章类型:C++函数展示 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-19 @Lab: CvLab20 ...

  8. c编程:求出4&#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

    //求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max, ...

  9. POJ1269:Intersecting Lines(判断两条直线的关系)

    题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点 ...

  10. 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

    今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...

随机推荐

  1. vue使用阿里oss上传

    1.首先用包管理工具 npm install ali-oss --S 下载oss依赖包 2.在util文件里创建util.js文件,在该文件写入 export default { getClient: ...

  2. LaTeX in 24 Hours - 3. Formatting Texts I

    文章目录 本章内容:文本格式 I 3.1 Sectional Units 3.2 Labeling and Referring Numbered Items 3.3 Texts Alignment 3 ...

  3. RPA现阶段的问题

    RPA(Robotic Process Automation)全称机器人流程自动化,作为"自动化为先"时代的翘楚和先驱,被广泛地用来代替人类自动执行任务,越来越多的领域.企业和人开 ...

  4. MySQL学习(十一)为什么不推荐使用uuid和雪花id

    参考博客:https://www.cnblogs.com/wyq178/p/12548864.html 自增的主键的值是顺序的,所以Innodb把每一条记录都存储在一条记录的后面.当达到页面的最大填充 ...

  5. 查看Doris表占用空间

    近期想统计下各表占用的存储空间大小,官网文档SHOW-TABLE-STATUS给的语句很简单,但是对于列的含义写的不是很明白,我写入数据验证了一下. Doris版本:1.2 查看当前数据库下所有表的信 ...

  6. ZOJ 3735 Josephina and RPG (概率dp)

    题意:给你一个n,然后给你C(n,3)个队伍, 给你每个队伍之间的胜率. 接下来给你m个队伍,让你依次跟他们比赛,开始你能选择任意的队伍,如果你打赢了一支队伍,你可以选择换成输给你的这个队伍或者不换, ...

  7. MySQL 更新执行的过程

    更多内容,前往 IT-BLOG Select语句的执行过程会经过连接器.分析器.优化器.执行器.存储引擎,同样的 Update语句也会同样走一遍 Select语句的执行过程. ​ 但是和 Select ...

  8. 基于列存储的开源分布式NoSQL数据库Apache Cassandra入门分享

    @ 目录 概述 定义 特性 与Hbase对比 Cassandra使用场景 术语 架构 概览 Dynamo 数据集分区使用令牌环的一致性哈希 存储引擎 部署 单实例部署 集群部署 CQL 概述 数据模型 ...

  9. 单机最快的队列Disruptor解析和使用

    前言 介绍高性能队列Disruptor原理以及使用例子. Disruptor是什么? Disruptor是外汇和加密货币交易所运营商 LMAX group 建立高性能的金融交易所的结果.用于解决生产者 ...

  10. Visual Studio 2022 不支持 .NET Framework 4.5 项目的解决办法

    概述 升级到Visual Studio  2022后,打开速度快了很多,开发体验也舒服很多.只是使用过程中遇到了一个比较尴尬的问题:默认Visual Studio 2022 不再支持安装 .NET F ...