LeetCode 使序列递增的最小交换(动态规划)

这篇博客探讨了LeetCode的一道难题,要求通过最小交换次数使两个长度相等的整型数组A和B都保持严格递增状态。文章指出,简单的贪心策略并不适用,并介绍了一种动态规划的解决方案,强调了状态转移方程的重要性。
摘要由CSDN通过智能技术生成

我们有两个长度相等且不为空的整型数组 A 和 B 。

我们可以交换 A[i] 和 B[i] 的元素。注意这两个元素在各自的序列中应该处于相同的位置。

在交换过一些元素之后,数组 A 和 B 都应该是严格递增的(数组严格递增的条件仅为A[0] < A[1] < A[2] < … < A[A.length - 1])。

给定数组 A 和 B ,请返回使得两个数组均保持严格递增状态的最小交换次数。假设给定的输入总是有效的。

示例:

输入: A = [1,3,5,4], B = [1,2,3,7]
输出: 1
解释: 
交换 A[3] 和 B[3] 后,两个数组如下:
A = [1, 3, 5, 7] , B = [1, 2, 3, 4]
两个数组均为严格递增的。

注意:

A, B 两个数组的长度总是相等的,且长度的范围为 [1, 1000]。
A[i], B[i] 均为 [0, 2000]区间内的整数。

思 路 分 析 : \color{blue}思路分析: 这道题的确实有点难度,对于分析归纳能力要求挺高的。
刚开始吧,可能大家都想着使用类似贪心策略,就是遇到A[i - 1] >= A[i]这种逆序的时候,我们就将A[i]和B[i]进行交换,这时大家都会被一个测试示例难倒

0   4   4   5
0   1   6   8

第一次遇到A[i - 1] >= A[i]时,i = 2,按照贪心策略,我们应该交换A[2]和B[2],交换之后我们又发现A[3]出现了逆序,接着有需要交换A[3]和B[3],所以总共需要两次交换。蛋式这道题只需要交换1次,即我们交换A[1]和B[1]即可同时达到A、B严格递增。因此这种简单的贪心策略行不通。

经过查阅别人的实现,发现了一种动态规划的方法。

swapVec[ i ] 表示第 i 个元素进行交换,使A[0, i],B[0,i]严格单调递增的最小交换次数
keepVec[ i ] 表示第 i 个元素不进行交换,使A[0, i],B[0,i]严格单调递增的最小交换次数。

现在的问题就是我们如何找到状态转移方程。

(1)如果A[ i ] > A[ i - 1 ] && B[ i ]> B[ i - 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值