给定一个整数数组,你可以修改任意一个任意正整数,并最终使整个数组严格增加并且是正整数,并且至少需要更改几个数字
输入: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;
}
有人建议这个问题有另一个解决方案,更有效,任何人都可以给我一些建议,谢谢提前
答案 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;
}