我对C很陌生并且通过Codility训练来学习它。
对于三重问题,但我只得到11%我不知道这里有什么问题。问题是:给出了由N个整数组成的非空零索引数组A.三重态(P,Q,R)的乘积等于A [P] * A [Q] * A [R](0≤P 您的目标是找到任何三联产品的最大产品。 写一个函数: ,给定非空零索引数组A,返回任何三元组的最大乘积的值。
例如,给定数组A使得: 函数应该返回60,因为三元组(2,4,5)的乘积是最大的。 假设:
•N是[3..100,000]范围内的整数;
•数组A的每个元素都是[-1,000..1,000]范围内的整数。 复杂性:
•预期的最坏情况时间复杂度为O(N * log(N));
•预期的最坏情况空间复杂度为O(1),超出输入存储(不计入输入参数所需的存储空间)。 我的代码给了我11%,我想知道我在这个代码中出错的地方。我首先对矩阵进行排序,然后比较三个最大的正数和最大的两个负数以及最大的正数:
int solution(int A[], int N);
A[0] = -3
A[1] = 1
A[2] = 2
A[3] = -2
A[4] = 5
A[5] = 6
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;
}
答案 0 :(得分:5)
你根本不需要排序。
首先对输入数组执行线性扫描并存储3个biggest和2个lowests(且小于零),然后结果为:
biggest
* max(2nd_biggest
* { {1}},3rd_biggest
* lowest
)
使用所有数字都在[-1000..1000]的事实,您甚至不需要编码。只需计入数组并存储最大和最低索引,扫描输入数组后只扫描计数数组即可找到所有需要的5个数字。
答案 1 :(得分:4)
Codility中的测验属于“排序”类别,因此故意要求使用排序。排序数组使测验变得微不足道。这是满足性能约束O(N * LogN)时间和O(1)空间的答案。
int solution(vector<int> &A) {
if(A.size() < 3) return 0;
if(A.size() == 3) return A[0]*A[1]*A[2];
size_t last = A.size()-1;
sort(A.begin(), A.end());
return max(A[0]*A[1]*A[last], A[last]*A[last-1]*A[last-2]);
}
答案 2 :(得分:1)
因为你正在学习,我认为你不想要一个完整的答案。所以我有两个提示。
Paul R指出了第一个:
你认为A [N]有效吗?
另一个是,这个部分的最坏情况时间复杂度是多少(它不是O(N * log(N))):
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;
}
}
你基本上必须计算完成两个元素之间的比较的时间。
你有2个循环:
N
次N-i
次。因此,在外循环的第一次运行中,您将进行N-0
比较,然后N-1
,然后N-2
,[...],最后{{1比较。
因此,它将进行N - (N-1) = 1
比较。这是N + (N-1) + (N-2) + ... + 1
的{{3}}。
所以复杂度为N(N+1)/2
,等于O(N(N+1)/2)
(known summation)
我建议您选择更快的排序算法,例如合并排序或快速排序。在我看来,合并排序更容易理解。
答案 3 :(得分:1)
Ruby Code,在代码上获得100/100
def solution(a)
a.sort!
if a[a.length - 1] >= 0
a[a.length - 1] * ([a[0] * a[1] ,a[a.length - 2] * a[a.length - 3]].max)
else
a[a.length - 1] * a[a.length - 2] * a[a.length - 3]
end
end
答案 4 :(得分:0)
好的家伙到目前为止非常感谢你的帮助......我仍然想知道如何在这个函数中实现合并排序(虽然不需要)....所以我得到了100%,这是我的代码:< / p>
int solution(int A[], int N) {
int i,N1,N2,N3,NEG1,NEG2,PQR_neg,PQR_pos;
N1=-1000;
N2=-1000;
N3=-1000;
NEG1=0;
NEG2=0;
for (i = 0; i <= (N-1); i++)
{
if (A[i] < NEG1 ) {
NEG2=NEG1;
NEG1=A[i];
}
else if (A[i] < NEG2) {
NEG2=A[i];
}
if (A[i] > N1) {
N3=N2;
N2=N1;
N1=A[i];
}
else if (A[i] > N2) {
N3=N2;
N2=A[i];
}
else if (A[i] > N3) {
N3=A[i];
}
}
PQR_neg = N1*NEG1*NEG2;
PQR_pos = N1*N2*N3;
if (PQR_pos>PQR_neg) return PQR_pos;
else return PQR_neg;
}
答案 5 :(得分:0)
int solution(int A[]) {
int k = 0;
int d = 0;
/*
* int p = 0; int q = 0;
*/
int p = 0;
int q = 1;
int r = -1;
int finalValue = -1;
for (int i = 1; i < A.length - 2; i++) {
if (A[q] < A[p]) {
if (k != 1) {
p = i - 1;
q = i;
}
if (A[i + 1] > A[i]) {
r = i + 1;
k = 0;
if (i + 2 < A.length - 1 && A[i + 2] > A[i + 1]) {
r = -1;
k = 1;
}
} else {
if (A[i + 1] < A[i]) {
q = i + 1;
r = -1;
k = 1;
}
}
} else {
p = i;
q = i + 1;
}
if (p != -1 && q != -1 && r != -1) {
finalValue = Math.max(finalValue, Math.min(A[p] - A[q], A[r]
- A[q]));
p = 0;
q = 1;
r = -1;
}
// if (finalValue > finalWalaValue)
// finalWalaValue = finalValue;
}
return finalValue;
}
答案 6 :(得分:0)
我知道这与问题无关,但对某些人可能有用。
我在 Java 中使用 100%的解决方案如下:
class Solution {
public int solution(int[] A) {
Arrays.sort(A);
int n = A.length;
int maxWithNegativeNumbers = A[0] * A[1] * A[n - 1];
int maxWithPositiveNumbers = A[n - 3] * A[n - 2] * A[n - 1];
return Math.max(maxWithNegativeNumbers, maxWithPositiveNumbers);
}
}
您还需要添加以下导入:
import java.util.*;
答案 7 :(得分:0)
工作100%,并在不同的情况下进行了测试。
// Function to remove the element
public int[] removeTheElement(int[] arr, int index)
{
// Create another array of size one less
int[] anotherArray = new int[arr.length - 1];
// Copy the elements except the index
// from original array to the other array
for (int i = 0, k = 0; i < arr.length; i++) {
// if the index is
// the removal element index
if (i == index) {
continue;
}
// if the index is not
// the removal element index
anotherArray[k++] = arr[i];
}
//Java >8
//IntStream.range(0, arr.length).filter(i -> i != index).map(i -> arr[i]).toArray();
return anotherArray;
}
//MaxProductOfThree
//A[P] * A[Q] * A[R] (0 <= P < Q < R < N).
public String maxProductOfThreeSolution(int[] A) {
long prod = 0;
String arryVal = "";
for(int i=0; i<A.length; i++) {
int[] B = removeTheElement(A, i);
for(int j=0; j<B.length; j++) {
int[] C = removeTheElement(B, j);
for(int k=0; k<C.length; k++) {
System.out.println(A[i] +":" +B[j]+":" +C[k] +"---->"+ (A[i] * B[j] * C[k]));
long sum = A[i] * B[j] * C[k];
if(sum >= prod) {
prod = sum;
arryVal = "Array index "+i+":"+j+":"+k+", Array index value "+A[i] +":" +B[j]+":" +C[k]+"";
}
}
}
}
return prod +": "+arryVal;
}
int[] g = {-3,1,2,-2,5,6};
System.out.println("Max Product Of Three : "+obj.maxProductOfThreeSolution(g));
输出
最大乘积三:60:数组索引5:4:2,数组索引值6:5:2
答案 8 :(得分:0)
另一个关于python解决方案O(N * log(N))100/100
def solution(A):
# write your code in Python 3.6
if len(A) < 3:
return 0
elif len(A) == 3:
return A[0]*A[1]*A[2]
A.sort()
max_negative_d = A[0] * A[1]
max_negative_t = A[-1] * A[-2] * A[-3]
return max(A[-1] * max(A[-2] * A[-3], max_negative_d), max_negative_t)
pass