修改数组的任何元素

时间:2014-12-02 06:15:15

标签: c algorithm

给定一个整数数组,你可以修改任意一个任意正整数,并最终使整个数组严格增加并且是正整数,并且至少需要更改几个数字

输入:5 1 2 2 3 4

输出:3

并且有我试过的,每个数字以减少更多a(第一个数字减1,然后第二个数字减去2,第三个数字减去3个)

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

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

1 个答案:

答案 0 :(得分:1)

我最近遇到了同样的问题。说清楚:

问题陈述

给你一个整数序列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(n)空间在O(nlogn)时间内计算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;
}