Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 查找整数序列中距离D的范围内有多少对数字_C_Algorithm - Fatal编程技术网

C 查找整数序列中距离D的范围内有多少对数字

C 查找整数序列中距离D的范围内有多少对数字,c,algorithm,C,Algorithm,让我们有一个不同的非负整数{0,2,3,4,7,10,12}的递增序列。判断一段距离内最多有多少对的最快方法是什么?假设D=3 例如,这里是[0,2],[0,3],[2,3],[2,4],[3,4],[4,7],[7,10],[10,12],所以是8 我对此的看法是: int arr[] = {0, 2, 3, 4, 7, 10, 12}; int arrLength = 7; int k = 1; int D = 3; int sum = 0; for (int i = 0; i <

让我们有一个不同的非负整数{0,2,3,4,7,10,12}的递增序列。判断一段距离内最多有多少对的最快方法是什么?假设D=3

例如,这里是[0,2],[0,3],[2,3],[2,4],[3,4],[4,7],[7,10],[10,12],所以是8

我对此的看法是:

int arr[] = {0, 2, 3, 4, 7, 10, 12};
int arrLength = 7;
int k = 1;
int D = 3;
int sum = 0;

for (int i = 0; i < arrLength;) {
    if (i + k < arrLength && arr[i + k] - arr[i] <= D) {
            sum++;
            k++;
    }
    else {
        i++;
        k = 1;
    }
    
}

printf("Number of pairs: %d\n", sum);
intarr[]={0,2,3,4,7,10,12};
int arrLength=7;
int k=1;
int D=3;
整数和=0;
对于(int i=0;i如果(i+kM(n)
是指定对的数量,我们将有
M(n)=M(n-1)+A[0..n-2]与A[n-1]的对的数量,其中A[n-1]小于D
。要找到递归的最后一部分,可以通过
log(n)来计算因此,该算法的时间复杂度是
T(n)=T(n-1)+log(n)=O(n log(n))
else
子句非常悲观。您不需要将
k
重置为1。显然
a[i+1]
[i+2,i+k]中的所有值形成一对<代码>范围。考虑一个滑动窗口,沿着(未测试)

行。
i=0;
j=1;
而(我    i = 0;
    j = 1;
    while (i < arrLen) {
        while (j < arrlen && a[j] - a[i] <= D) {
            j++;
        }
        i++;
        sum += j - i;
        if (i == j) {
            j++;
        }
   }