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

640?wx_fmt=gif

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=jpeg

—————  第二天  —————

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

举个例子,给定如数组:

640?wx_fmt=png

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

显然应该删除元素2:

640?wx_fmt=png

剩余元素的乘积  = 5 X 8 X 6 X9 X 7 = 15120

640?wx_fmt=jpeg

640?wx_fmt=jpeg640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

————————————

640?wx_fmt=jpeg

640?wx_fmt=jpeg

小灰把面试题目告诉给了大黄......

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=jpeg

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

640?wx_fmt=png

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

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=jpeg

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

640?wx_fmt=png

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

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=jpeg

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

640?wx_fmt=png

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

640?wx_fmt=jpeg

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

  • 情况A:奇数个负数

  • 情况B:偶数(包括0)个负数

    • 子情况:没有非负数

640?wx_fmt=jpeg

640?wx_fmt=jpeg

public static int findRemovedIndex(int[] array){	
    // 1.统计负元素的个数	
    int negativeCount = 0;	
    for(int i=0; i<array.length; i++){	
        if(array[i] < 0){	
            negativeCount ++;	
        }	
    }	
    // 2.根据不同情况,选择要删除的元素	
    int tempIndex = 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;	
                }	
            }	
            return tempIndex;	
        };	
        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,-7,-21,9,-1,5,6};	
    int index = findRemovedIndex(array1);	
    System.out.println("删除元素下标:"+ array1[index]);	
    int[] array2 = {4,3,5,-7,-21,9,-1,-5,6,0};	
    index = findRemovedIndex(array2);	
    System.out.println("删除元素下标:"+ array2[index]);	
    int[] array3 = {-4,-3,-5,-7,-21,-9,-1,-8};	
    index = findRemovedIndex(array3);	
    System.out.println("删除元素下标:"+ array3[index]);	
}

这段代码实现包含两步:

1.遍历数组,统计数组当中负数元素的个数。

2.根据负数元素的奇偶性,选择不同的处理方式。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=png

上面这个数组是典型的情况B,即负数个数是偶数的情况。那么要想让剩余元素乘积最大,我们只要删除最小的非负元素,也就是删除元素0即可:

640?wx_fmt=png

640?wx_fmt=jpeg

—————END—————

漫画算法》


640?wx_fmt=png

本书是全彩印制,书中的每一章、每一节、每一句话、每一幅图、每一行代码,都经过了小灰和编辑们的精心打磨,力求用最为直白的方式把知识讲明白、讲透彻。

对于渴望学习算法的小伙伴,无论你是正在学习计算机专业的学生,还是已经进入职场的新人,亦或是拥有多年工作经验却不擅长算法的老手,这本《漫画算法》都能帮助你告别对算法的恐惧,认识算法、掌握算法。

扫码购买

640?wx_fmt=png

640?wx_fmt=gif

©️2020 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值