leedcode 1187. 使数组严格递增

思路分析 :
定义 dp[i] 表示 i 位置的数字尚未更换且符合题目要求的最小交换次数,为什么要满足 i 位置的数字未交换呢? 因为 i 位置的数你如果交换你是该给他换成多大的你是不知道的,因此我们最后解题可以在最末尾添加一个数字即可。
然后对于 i 位置之前的数,我们可以选择交换 1个、2个、3个...
代码示例 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | class Solution { public : int makeArrayIncreasing(vector< int >& arr1, vector< int >& arr2) { sort(arr2.begin(), arr2.end()); arr2.erase(unique(arr2.begin(), arr2.end()), arr2.end()); arr1.push_back(1e9+10); arr1.insert(arr1.begin(), -1); // for(int i = 0; i < arr2.size(); i++) printf("%d ", arr2[i]); int dp[2005]; dp[0] = 0; dp[1] = 0; for ( int i = 2; i < arr1.size(); i++){ dp[i] = 1e9+10; int j = lower_bound(arr2.begin(), arr2.end(), arr1[i]) - arr2.begin(); for ( int k = 1; k <= min(i-1, j); k++){ if (arr1[i-k-1] < arr2[j-k]) dp[i] = min(dp[i], dp[i-k-1]+k); } if (arr1[i-1] < arr1[i]) dp[i] = min(dp[i], dp[i-1]); } int len = arr1.size(); int ans = -1; if (dp[len-1] != 1e9+10) ans = dp[len-1]; return ans; } }; |
作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
东北日出西边雨 道是无情却有情
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
2018-07-24 The 2018 ACM-ICPC China JiangSu Provincial Programming Contest(第六场)
2018-07-24 曼哈顿距离