我正在努力解决问题。我们将在O(n)中找到数组的maxProduct,因此不允许使用双循环,因为它将是O(n²) 您将在我的代码中看到,除了第一个和最后一个元素之外,所有元素都是多重的。如何使用代码逻辑将数组的第一个和最后一个元素相乘?
这是我的代码:
public class Maxprod {
public static void main(String [] args){
Maxprod myclass = new Maxprod();
myclass.maxProduct();
}
public void maxProduct(){
int [] myarr = {4, -5, -7, 5};
int max = 0, p=0;
int q = 0;
for(int i=0; i <myarr.length-1; i++){
p = myarr[i]*myarr[i+1]; // 4 * 5 is missing here
if (p > max){
max = p;
}
}
System.out.println(max);
}
}
答案 0 :(得分:0)
您的代码情况似乎比您想象的要糟糕;从我看到你不仅错过(4 * 5),而且(4 * -7)和(-5 * -5)。你确定你只需要连续的号码吗?你也错过了(-7 * 5),因为你的for循环条件是一个。
要回答您最直接的问题,请将p初始化为(start * end):
p = myarr[0] * myarr[myarr.length-1];
for(int i=0; i <myarr.length; i++){
p = myarr[i]*myarr[i+1]; // 4 * 5 is missing here
if (p > max){
max = p;
}
}
System.out.println(max);
如果您真的想要maxProduct,考虑所有排列,在O(n)中,您需要跟踪两个最大正数和两个最大负数。考虑这样的事情:
public void maxProduct(){
int [] myarr = {4, -5, -7, 5};
int max = 0, maxn = 0, maxp = 0;
int n1 = 0, n2 = 0;
int p1 = 0, p2 = 0;
for(int i=0; i <myarr.length; i++){
// Store greatest negative pair
if (myarr[i] < n1) {
n2 = n1;
n1 = myarr[i];
}
// Store greatest positive pair
if (myarr[i] > p1) {
p2 = p1;
p1 = myarr[i];
}
}
maxn = n1 * n2;
maxp = p1 * p2;
if (maxn > maxp) {
max = maxn;
} else {
max = maxp;
}
System.out.println(max);
}