LeetCode刷題MEDIM篇Product of Array Except Self
阿新 • • 發佈:2018-12-20
題目
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:
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];
}
}
}