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; } };
东北日出西边雨 道是无情却有情