1. 程式人生 > >LeetCode刷題MEDIM篇Product of Array Except Self

LeetCode刷題MEDIM篇Product of Array Except Self

題目

Given an array nums of n integers where n > 1,  return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].

Example:

Input:  [1,2,3,4]
Output: [24,12,8,6]

Note: 

Please solve it without division and in O(n).

Follow up:
Could you solve it with constant space complexity? (The output array does not count as extra space for the purpose of space complexity analysis.)

十分鐘嘗試

本來第一反應,當前元素輸出output值應該是全部的product除以當前元素,以為很完美可以處理,寫完發現,忽略了一個0,如果有0我的程式碼不行,為了排除0,寫了分支條件,還是不行。

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int[] output=new int[nums.length];
        int allProduct=1;
        int allProductExceptZero=1;
        //如果有0不對
        for(int i=0;i<nums.length;i++){
            allProduct*=nums[i];
        }
        if(allProduct==0){
            //有0則,其他都是0,是0的位置不為0
            for(int k=0;k<nums.length;k++){
                if(nums[k]!=0){
                    allProductExceptZero*=nums[k];
                    output[k]=0;
                }
            }
            for(int m=0;m<nums.length;m++){
                if(nums[m]==0){
                    output[m]=allProductExceptZero;
                }
            }
            return output;
        }
        for(int j=0;j<nums.length;j++){
            output[j]=allProduct/nums[j];
        }
        return output;
    }
}

正確解法

舉例1 2 3 0 4,如果選擇3,那麼其實結果是左側乘積*右側乘積。所以第一層迴圈,計算截止到某個元素的累計乘積結果,右側,再一次迴圈,最後一個元素就是1,第二個就是nums[j],第三個right*=nums[j],利用right表示右側的累計乘積結果。所以程式碼如下:

class Solution {
    public int[] productExceptSelf(int[] nums) {
      int[] res=new int[nums.length];
      res[0]=1;
      for(int i=1;i<nums.length;i++){
          res[i]=res[i-1]*nums[i];
      }
      int right=1;
      for(int j=nums.length-1;j>=0;j--){
          res[j]*=right;
          right*=nums[j];
      }  
        
    }
}