漫画:去掉一个数,如何让剩余的数乘积最大?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了漫画:去掉一个数,如何让剩余的数乘积最大?相关的知识,希望对你有一定的参考价值。

漫画:去掉一个数,如何让剩余的数乘积最大?

技术图片

技术图片

————— 第二天 —————
技术图片
技术图片
技术图片

举个例子,给定如下数组:
技术图片

要删除哪个元素,才能使得剩余元素的乘积最大呢?

显然应该删除元素2:

技术图片

剩余元素的乘积 = 5 X 8 X 6 X9 X 7 = 15120
技术图片
技术图片
技术图片
技术图片
技术图片

————————————
技术图片
技术图片

小灰把面试题目告诉给了大黄......
技术图片
技术图片
技术图片
技术图片
技术图片
技术图片

数组中哪个负数的绝对值最小呢?显然是元素-2:

技术图片

我们删去元素-2,原本数组中的三个负数变成了两个,负负得正,而且保证了剩余元素的乘积最大。
技术图片
技术图片
技术图片
技术图片
技术图片

数组中哪个非负元素最小呢?显然是元素3:
技术图片

我们删去元素3,数组中剩余元素的乘积仍然是正数,而且绝对值最大。
技术图片
技术图片
技术图片
技术图片
技术图片

数组中哪个负数元素的绝对值最大呢?显然是元素-9:

技术图片

既然剩余元素的乘积无论如何都是负的,我们就索性删去绝对值最大的元素-9,使得剩余元素乘积的绝对值尽可能小。
技术图片

总结一下,需要考虑的数组元素情况共有三种:

  • 情况A:奇数个负数
  • 情况B:偶数(包括0)个负数
  • 子情况:没有非负数
    技术图片
    技术图片
public static int findRemovedIndex(int[] array){
    // 1.统计负元素的个数

intnegativeCount = 0;    
for(int i=0; i<array.length; i++){

if(array[i] < 0){
            negativeCount ++;        }

}

// 2.根据不同情况,选择要删除的元素
    inttempIndex = 0;

if((negativeCount&1)==1){

//情况A:负数个数是奇数
        for(int i=1; i<array.length; i++){            
if(array[i] < 0){         
if(array[tempIndex]>=0 || array[i]>
array[tempIndex]){         
tempIndex = i;               
}

}

}

return
 tempIndex;    } else

{

//情况B:负数个数是偶数

if(array.length == negativeCount){

//子情况:所有元素都是负数

for(int i=1; i<array.length; i++){
                if(array[i] < array[tempIndex]){
                    tempIndex =i;

}

}

returntempIndex;        };        
for(int i=1;i<array.length; i++){

if(array[i] >= 0){

if(array[tempIndex]<0 ||
 array[i]<array[tempIndex]){                  
 tempIndex = i;             
 }          
 }

}

return tempIndex;

}
}

public static void main(String[] args) {
    int[] array1 = {-4,3,-5,-21,9,-1,5,6};

int index =findRemovedIndex(array1);

System.out.println("删除元素下标:"+ array1[
index]);    int[] array2 = {4,
,5,-721,9,-1,-5,6,0};    index = findRemovedIndex(
array2);   
System.out.println("删除元素下标:"+ array2[index]);   []
 array3 = {-4,-3,-5,-7,-21,-91,-8};
    index = findRemovedIndex(array3);

System.outprintln("删除元素下标:"+ array3[index]);}

这段代码实现包含两步:
1.遍历数组,统计数组当中负数元素的个数。
2.根据负数元素的奇偶性,选择不同的处理方式。
技术图片
技术图片
技术图片
技术图片
上面这个数组是典型的情况B,即负数个数是偶数的情况。那么要想让剩余元素乘积最大,我们只要删除最小的非负元素,也就是删除元素0即可:
技术图片
技术图片

—————END—————

喜欢本文的朋友,欢迎关注公众号 程序员小灰,收看更多精彩内容
技术图片

欢迎长按二维码关注 小灰学英语,你所学到的不只是英语!
技术图片

给个[在看],是对小灰最大的支持!

以上是关于漫画:去掉一个数,如何让剩余的数乘积最大?的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces-462A. A Compatible Pair

leetcode关于数组的问题

# 韩信点兵问题(中国剩余定理)

NOIp2000 乘积最大

628. 三个数的最大乘积『简单』

Codeforces-1077C