c - 修改数组任意元素

标签 c algorithm

给定一个整数数组,可以任意修改任意多个正整数,最终使得整个数组严格递增且均为正整数,并且要求至少需要改变几个数字

输入:5 1 2 2 3 4

输出:3

这是我尝试过的,每个数字都可以减少更多的a(第一个数字减一,然后第二个数字减二,第三个数字减三)

    #include <stdio.h>
    int Modify_the_array(int B[],int n);
    int max(int a,int b);
    int main(int argc,char *argv) {

        int before_array[]={1,2,3,4,1,2,3,4,5};
        int len=sizeof(before_array[0])/sizeof(before_array);
        int b;
        b=Modify_the_array(before_array,len);
        printf("%d\n",b);
        return 0;
    }

    int max(int a,int b){
        return a>b?a:b;
    }

    int Modify_the_array(int B[],int len) {
        int i,b=0,n=1;
        int maxsofar,tmp,j;
        for (i=0;i<len;i++){
            B[i]=B[i]-n;
            n++;
         }

        maxsofar=0;
        tmp=0;
        for(i=0;i<len;i++) {
            for (j=i+1;j<len;j++) {
            if (B[j]==B[i]&&B[i]>1) {
                maxsofar=max(maxsofar,++tmp);
                b=len-maxsofar;
            }
        }
    }
        return b;
}

有人建议这个问题有另一种解决方案,更有效,任何人都可以给我一些建议,提前感谢

最佳答案

我最近也遇到了同样的问题。澄清一下:

问题陈述

给定一个整数序列 a1,a2,a3.....an。您可以自由地将任何整数替换为任何其他正整数。必须替换多少个整数才能使结果序列严格递增?

输入格式

测试用例的第一行包含一个整数 N - 序列中的条目数。 下一行包含 N 个空格分隔的整数,其中第 i 个整数是 ai。

输出格式

输出最少需要替换多少个整数才能使序列严格递增。

根据您的输入,len = 5, arr = [1 2 2 3 4],减去index+1后,得到[0 0 -1 -1 -1]

忽略负元素(必须更改这些元素),计算 Longest Increasing Subsequence (对于这个问题是非递减的),这是一个经典的动态规划问题。

表示LIS = n的长度(这些元素不会改变)。所以最终的答案(不属于递增子序列和被忽略的负数部分)是len-n(5-2=3)。

我们可以在 O(nlogn) 时间和 O(n) 空间内计算 LIS。

int solve(vector<int> &arr) {
    int len = arr.size();
    for(int i = 0; i < len; i++) {
        arr[i] -= i+1;
    }
    vector<int> lis(len,0);
    int n = 0;
    for(int i = 0; i < len; i++) {
        if(arr[i] >= 0) {
            int pos = binarysearchPos(lis,n,arr[i]);
            lis[pos] = arr[i];
            if(n == pos)
                n++;
        }
    }
    return len-n;
}

int binarysearchPos(vector<int> &arr, int n, int target) {
    if(n == 0)
        return 0;
    if(arr[n-1] <= target)
        return n;
    int low = 0, high = n-1;
    while(low < high) {
        int mid = (low+high)/2;
        if(arr[mid] > target) {
            high = mid;
        } else {
            low = mid+1;
        }
    }
    return low;
}

关于c - 修改数组任意元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27243014/

相关文章:

c - scanf()将新行char留在缓冲区中

algorithm - 二部图中的最大匹配

javascript - 算法:生成小马移动到所有棋盘格的路径

c - 如何用 C 语言实现这种外部合并排序算法?

c - 如果我忘记将 null 分配给文件指针,如何检查文件是否打开

c - 如果我创建一个原子变量,线程之间对该变量的所有操作都是原子的吗?

具有固定项的整数分区的数组 [矩阵] 的 Java 数组

algorithm - 如果 p 是素数,如何使用快速算法检查 ap + b 是否是素数?

algorithm - 如何从递归函数中获取终止原因?

c - 如何与其他进程共享现有的 char *?