zoukankan      html  css  js  c++  java
  • LeetCode 1187. 使数组严格递增

    tle 但是我好开心啊(真)

    #include<bits/stdc++.h>
    using namespace std;
    
    int srh(vector<int>& arr1, vector<int>& arr2, int a, int b)
    {//搜索改完,搜完,一定要改回来再搜,保持之后的人还是原数组
        if(a>=arr1.size()) return 0;
        int ans = arr2.size()+1;
        int j = b;//先搜索换的部分
        for(; j < arr2.size(); j++)
        {//找到比前一个数字大一点的那个
            if(arr2[j] > arr1[a-1]) break;
        }
        if(j < arr2.size()) 
        {//如果存在大一点的那个,就换然后搜
            int t = arr1[a];
            arr1[a] = arr2[j];
            ans = srh(arr1, arr2, a+1, j+1)+1;
            arr1[a] = t;//把数字换回去
        }//然后搜不换的情况(如果不换也暂时可以的话)
        if(arr1[a] > arr1[a-1]) ans = min(ans,srh(arr1, arr2, a+1, b));
        return ans;
    }
    
    int makeArrayIncreasing(vector<int>& arr1, vector<int>& arr2) {
        sort(arr2.begin(), arr2.end());
        vector<int>::iterator new_end = unique(arr2.begin(), arr2.end());//"删除"相邻的重复元素
        arr2.erase(new_end, arr2.end());//删除(真正的删除)重复的元素
        int t = arr1[0];
        arr1[0] = arr2[0];
        int ans = srh(arr1, arr2, 1, 1)+1;
        arr1[0] = t;
        ans = min(ans, srh(arr1, arr2, 1, 0));
        if (ans > arr2.size()) ans = -1;
        return ans;
    }
    
    int main(int argc, char const *argv[])
    {
        int a[10] = {5,16,19,2,1,12,7,14,5,16};
        int b[15] = {6,17,4,3,6,13,4,3,18,17,16,7,14,1,16};
        vector<int> arr1(a, a+10);
        vector<int> arr2(b, b+15);
        int ans = makeArrayIncreasing(arr1, arr2);
        cout<<ans<<endl;
        return 0;
    }
    

    dp的解法

    #include<bits/stdc++.h>
    using namespace std;
    
    int makeArrayIncreasing(vector<int>& arr1, vector<int>& arr2) {
        sort(arr2.begin(), arr2.end());
        vector<int>::iterator new_end = unique(arr2.begin(), arr2.end());//"删除"相邻的重复元素
        arr2.erase(new_end, arr2.end());//删除(真正的删除)重复的元素
        int n = arr1.size();
        int m = arr2.size();
        int ans = m+1;
        int dp[2020][2020];
        memset(dp, 0x3f, sizeof(dp));
        dp[0][0] = 0;
        for (int j = 1; j <= m; ++j)
        {
            dp[0][j] = 1;
        }
        for (int i = 1; i < n; ++i)
        {
            if (arr1[i-1] < arr1[i])
            {//本步不进行换 上一步也不换
                dp[i][0] = min(dp[i][0], dp[i-1][0]);
            }
            int l = 0;
    
            while(l < m && arr2[l] < arr1[i]) l++; 
            for (int k = 1; k <= l; ++k)
            {//本步不进行换 上一步换
                dp[i][0] = min(dp[i][0], dp[i-1][k]);
            }
    
            l = 0;
            while(l < m && arr2[l] <= arr1[i-1]) l++;
            for (int j = l+1; j <= m; ++j)
            {//本步换,上一步不换
                dp[i][j] = min(dp[i][j], dp[i-1][0]+1);
            }
    
            for (int j = 2; j <= m; ++j)
            {//本步换,上一步也换
                dp[i][j] = min(dp[i][j],dp[i-1][j-1]+1);
            }
        }
        for (int j = 0; j <= m; ++j)
        {
            ans = min(ans, dp[n-1][j]);
        }
        if (ans > m) ans = -1;
        return ans;
    }
    
    int main(int argc, char const *argv[])
    {
        int a[12] = {23,10,9,12,3,14,21,16,7,10,17,12};
        int b[19] = {6,5,0,15,2,17,4,11,6,5,8,15,10,1,20,11,14,13,8};
        vector<int> arr1(a, a+12);
        vector<int> arr2(b, b+19);
        int ans = makeArrayIncreasing(arr1, arr2);
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    配置ftp服务器只能上传不能进行其他操作
    教你用CMD命令查询域名的DNS解析记录:A,NS,MX,CNAME,TXT
    js 多选选择删除数据
    类加载是为了执行静态方法
    数据库 基本命令
    在where子句中经常使用的运算符
    数据库编码问题
    JSP2.0自定义标签
    实现一个基本防盗链标签
    自定义标签
  • 原文地址:https://www.cnblogs.com/nanf/p/lc1187.html
Copyright © 2011-2022 走看看