漫畫:去掉一個數,如何讓剩餘的數乘積最大?

  • 2019 年 10 月 30 日
  • 筆記

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

舉個例子,給定如下數組:

要刪除哪個元素,才能使得剩餘元素的乘積最大呢?

顯然應該刪除元素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.統計負元素的個數      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.根據負數元素的奇偶性,選擇不同的處理方式。

上面這個數組是典型的情況B,即負數個數是偶數的情況。那麼要想讓剩餘元素乘積最大,我們只要刪除最小的非負元素,也就是刪除元素0即可:

—————END—————