每个连续子阵列的最大值

时间:2016-03-15 17:21:22

标签: c arrays algorithm

给定一个未整数的整数A[0...n-1]和一个整数k; C中所需的算法应该计算每个大小为k的连续子阵列的最大值。例如,如果A = [8,5,10,7,9,4,15,12,90,13]k=4,则findKMax(A,4,10)会返回10 10 10 15 15 90 90

我的目标是将算法实现为C程序,读取A的元素,读取k,然后打印函数findKMax(A,4,10)的结果。输入/输出示例如下所示(输入以粗体排版):

A的要素: 8 5 10 7 9 4 15 12 90 13结束

键入k: 4

结果:1​​0 10 10 15 15 90 90

到目前为止我尝试过什么?请记住,我是C的绝对初学者。这是我的代码:

#include <stdio.h>

void findKMax(int A[], int k, int n) {

int j;
int max;

for (int i = 0; i <= n-k; i++) {
    max = A[i];

    for (j = 1; j < k; j++) {
        if (A[i+j] > max)
            max = A[i+j];
    }

}
}

int main() {

int n = sizeof(A);
int k = 4;

printf("Elements of A: ");
scanf("%d", &A[i]);
printf("Type k: %d", k);
printf("Results: %d", &max);

return 0;
}

3月17日更新:

我修改了源代码,即我试图实现Michael Burr和Priyansh Goel的提示。这是我的结果:

#include <stdio.h>

// Returning the largest value in subarray of size k.
void findKMax(int A[], int k, int n) {

int j;
int largestValueOfSubarray;

for (int i = 0; i <= n-k; i++) {
    largestValueOfSubarray = A[i];

    for (j = 1; j < k; j++) {
        if (A[i+j] > largestValueOfSubarray)
            largestValueOfSubarray = A[i+j];
    }
    printf("Type k: %d", k);

}
return largestValueOfSubarray;
}

int main() {

int n = 10;
int A[n];
// Reading values into array A.
for (int i = 0; i < n; i++) {
    printf("Enter the %d-th element of the array A: \n", i);
    scanf("%d", &A[i]);
}

// Printing of all values of array A.
for (int i = 0; i < n; i++) {
    printf("\nA[%d] = %d", i, A[i]);
}

printf("\n\n");

// Returning the largest value in array A.
int largestValue = A[0];
for (int i = 0; i < n; i++) {
    if (A[i] > largestValue) {
        largestValue = A[i];
    }
}
printf("The largest value in the array A is %d. \n", largestValue);

return 0;
}

我想代码没有那么多。任何人都可以给我一个提示如何做其余的事情。我需要一个建议如何将这些代码“组合”到一个正在运行的程序中。

2 个答案:

答案 0 :(得分:0)

由于您是初学者,让我们从最简单的算法开始。

对于每一个i,你需要从那个i开始找到k个连续数字的总和。然后找到它的最大值。

在此之前,您需要了解如何将输入输入到数组中。

int n;
scanf("%d",&n);

int a[n];
for(int i = 0; i < n; i++) {
  scanf("%d",&a[i]);
}

此外,您需要调用函数findKMax(a,n,k); 在findKMax函数中,您必须实现我提到的算法。

我不会提供代码,以便您可以自己尝试。如果您遇到任何问题,请告诉我。

提示:您需要使用嵌套循环。

答案 1 :(得分:0)

您可以多次在窗口中找到最大值,但只输出最后一个最大值。

最简单的修正 - 在主循环结束时添加输出:

for (int i = 0; i <= n-k; i++) {
    max = A[i];

    for (j = 1; j < k; j++) {
        if (A[i+j] > max)
            max = A[i+j];
    }
    printf("Type k: %d", k);
}

下一步 - 收集单个字符串"10 10 10 15 15 90 90"中的所有本地最大值或长度为n-k+1: [10,10,10,15,15,90,90]的其他数组,并在主循环后打印它(我不知道最好的方法是C)