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

  

 

作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

posted @   楼主好菜啊  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2018-07-24 The 2018 ACM-ICPC China JiangSu Provincial Programming Contest(第六场)
2018-07-24 曼哈顿距离
点击右上角即可分享
微信分享提示