leedcode 1187. 使数组严格递增

 

思路分析 : 

定义 dp[i] 表示 i 位置的数字尚未更换且符合题目要求的最小交换次数,为什么要满足 i 位置的数字未交换呢? 因为 i 位置的数你如果交换你是该给他换成多大的你是不知道的,因此我们最后解题可以在最末尾添加一个数字即可。

然后对于 i 位置之前的数,我们可以选择交换 1个、2个、3个...

代码示例 :

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 @ 2022-07-24 17:13  楼主好菜啊  阅读(66)  评论(0编辑  收藏  举报