c++ - 数组中相隔 8 个或更多位置的两个元素的最大乘积

标签 c++ c algorithm time-complexity

这是我目前遇到的问题和代码。

我有一个正数序列。序列的长度大于 8,负数(不是序列的一部分)是序列结束的标志。我需要编写一个程序(按时间和内存使用情况有效)找到由 8 个或更多位置分隔的 2 个元素的最大乘积。保证答案小于2000000000。

例如,对于 {1 2 3 4 5 6 7 8 9 10 -1},答案将是 20

我的代码:

#include <stdio.h>
#include <stdlib.h>

static long long int find_max(long int *v1, long int size) {
    const int d = 8;
    long int arr[8];
    long int maxi = 0;  
    long long int max_pr = 0;

    for (int i = 1; i < d + 1; i++) {
        arr[i % d] = v1[i - 1];
    }
    for (int j = d + 1; j < size + 1; j++) {
        if (arr[j % d] > maxi)
            maxi = arr[j % d];
        if (v1[j - 1] * maxi > max_pr)
            max_pr = v1[j - 1] * maxi;
        arr[j % d] = v1[j - 1];
    }
    return max_pr;
}

int main() {
    long int seq[100000];
    long int n = 0;

    while (n < 100000 && scanf("%ld", &seq[n]) == 1) {
        if (seq[n] < 0) {
            break;    //vector.push_back was too slow
        }
        n++;
    }

    long long int answer = find_max(seq, n);
    printf("%lld ", answer);

    return 0;
}

这是一道算法和数据结构公开课的作业题,与我的学位无关。我的代码在测试系统上失败。我已经尝试解决这个问题几天了,但无法理解我在这里做错了什么,因为它对我能想到的每个例子都运行良好。

如果有任何帮助,我将不胜感激。

最佳答案

这很容易在线性时间内完成,不需要任何额外的存储空间。想想哪些数字可能是可能的解决方案:它可能是第一个数字乘以第九个数字。它可能是前两个中最大的,乘以第十。它可以是前三个中最大的,乘以第十一个,依此类推。所以:

Set maxN = 0, maxProduct = 0, i = 0. 
As long as v1 [i + 8] ≥ 0:
    If v1 [i] > maxN then maxN = v1 [i]
    If v1 [i + 8] * maxN > maxProduct then maxProduct = v1 [i + 8] * maxN.
    Let i = i + 1.

就是这样。

关于c++ - 数组中相隔 8 个或更多位置的两个元素的最大乘积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36104002/

相关文章:

c++ - CreateEvent 初始状态已发信号不是发信号事件

c - 在c中实现异或加密时没有输出到磁盘

c++ - 定时器上的Arduino PID

algorithm - 什么排序算法适合这个 'stream-like' 条件?

algorithm - 如何打印表达式所有可能的平衡括号?

c++ - 帮助理解这一点?

c++ - make 查找 fortran 77 文件但不查找 fortran 90 文件

c++ - 升压同步

c++ - ISO C++ 说这些是模棱两可的,

c - OpenGL 截取背景屏幕截图而不是执行