c - C 中的 Triplet Codility - 仅获得 11%(训练)

标签 c

我对 C 还很陌生,并且部分地通过 Codility 培训来学习它。

对于三重问题,我只得到 11% 我不确定这里有什么问题。问题是:给定一个由 N 个整数组成的非空零索引数组 A。三元组 (P, Q, R) 的乘积等于 A[P] * A[Q] * A[R] (0 ≤ P < Q < R < N)。

您的目标是找到任何三元组的最大乘积。

写一个函数:

int solution(int A[], int N); 

给定一个非空的零索引数组 A,返回任何三元组的最大乘积的值。 例如,给定数组 A 这样:

A[0] = -3
A[1] = 1
A[2] = 2
A[3] = -2
A[4] = 5
A[5] = 6 

函数应返回 60,因为三元组 (2, 4, 5) 的乘积最大。

假设: •N为[3..100,000]范围内的整数; •数组A的每个元素都是[−1,000..1,000]范围内的整数。

复杂性: •预期的最坏情况时间复杂度为O(N*log(N)); •预期的最坏情况空间复杂度为 O(1),超出输入存储空间(不包括输入参数所需的存储空间)。

我的代码给了我 11%,我想知道这段代码哪里出了问题。我首先对矩阵进行排序,然后比较三个最大的正数和 2 个最大的负数以及最大的正数:

int solution(int A[], int N) {
    int i,j,PQR_pos,PQR_neg, temp;

    for (i=0; i<N; i++) { 
        for (j=0; j<N-i; j++) 
            if (A[j+1] < A[j]) { /* compare the two neighbours */ 
                temp = A[j]; /* swap a[j] and a[j+1] */ 
                A[j] = A[j+1]; 
                A[j+1] = temp; 
            } 
    }

    PQR_pos = A[N] * A[N-1] * A[N-2];
    PQR_neg = A[N] * A[1] * A[0];

    if (PQR_pos>PQR_neg) return PQR_pos;
    else return PQR_neg;

}

最佳答案

你根本不需要排序。

首先对输入数组进行一次线性扫描,存储最大的3个和最小的2个(且小于零),则结果为:
max(
最大 * 第二大 * 第三大 ,
最大 * 最低 * 2nd_lowest)

利用所有数字都在 [-1000..1000] 中这一事实,您甚至不需要编码。只需在数组中计数并存储最大和最小索引,在扫描输入数组后只需扫描计数数组即可找到所有 5 个需要的数字。

关于c - C 中的 Triplet Codility - 仅获得 11%(训练),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22984503/

相关文章:

c - 在 C 中使用递归反转链表

c - 什么是 ;随机字符串;在C中表示

c - 在C语言中如何找到内存地址中包含的内容?

c - sizeof 报错值

c - 内联汇编出现段错误(核心转储)

Crc32 C 实现 - 不起作用

c++ - memset 和 _strnset 之间的区别

c - 如何在STM32F4、Cortex M4上读写FLASH

python - 将任意长度的列表或元组传递给用 C 编写的 Python 扩展

c - 在 C 中使用 struct 的正确方法是什么?