持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。
题目(已做删减处理)
我们有两个长度相等且不为空的整型数组 nums1 和 nums2 。在一次操作中,我们可以交换 nums1[i] 和 nums2[i]的元素。例如,如果 nums1 = [1,2,3,8] , nums2 =[5,6,7,4] ,你可以交换 i = 3 处的元素,得到 nums1 =[1,2,3,4] 和 nums2 =[5,6,7,8] 。返回 使 nums1 和 nums2 严格递增 所需操作的最小次数 。
分析
我们假定:
- dp[i][0]表示A和B位置i上的数不做交换时的最少次数
- dp[i][1]表示A和B位置i上的数做交换时的最少次数
题目中有个条件,即数组中一定是严格递增的,因此我们可以将情况分为以下三种:
- 当dp[i-1]<dp[i]&&dp[i-1]<dp[i]时,dp[i-1]<dp[i]&&dp[i-1]<do[i],i-1和i的交换互不影响,找到两者中的最小数值;
- 当dp[i-1]<dp[i]&&dp[i-1]<dp[i]时,dp[i-1]>dp[i]&&dp[i-1]<do[i] || dp[i-1]<dp[i]&&dp[i-1]>dp[i],i-1交换则位置i也要交换,位置i-1不交换则位置i也不交换。
- 当dp[i-1]<dp[i]&&dp[i-1]<dp[i]不成立时,则位置i-1交换时,位置i不能交换,位置i-1不交换时,位置i必须交换
特别的,我们如果考虑到边界的特殊性,即 dp[0][0]=0,dp[0][1]=1 时,我们只要返回 dp[n-1][0] 与 dp[n-1][1] 的最小值即可
总结
一道标记为hard难度的算法题目。其实如果你懂得分析题目,并且对于动态规划知识点比较熟悉的话,很容易就能解出来。但是众所周知,动态规划对于刚学算法,或者是算法不深入的同学来讲,任何一道题目都是特别困难的,别说是这种普通的题目,就是常见的模板题,都要思考很久,甚至是先背诵后理解,才能慢慢明白其中的思路。
我的建议是,这道题目,如果你对于算法只是想面试或者笔试。完全可以不用放在心上,因为它首先是道hard题目,其次是动态规划相关。算法新人们可以从基础打起,找点动态规划的简单题目熟悉熟悉思路。