[LeeCode238] Product of Array Except Self


Description:

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

Solve it without division and in O(n).

For example, given [1,2,3,4], return [24,12,8,6].

  • Follow up:

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


題目描述:
  • 給定一個數組,對數組中的每個元素求除自身外的其他元素的乘積
  • 比如:給定 [1,2,3,4], 返回結果 [24,12,8,6].
注意事項:
  1. 不能使用除法
  2. 使用固定的額外空間
  3. O(n)效率

思考過程:

  1. 如果題目沒有加O(n)條件的話,可以使用循環嵌套暴力求解,但是效率非常低
  2. 如果沒有限制不能使用除法,可以先循環一次計算所有元素乘積,再次循環用乘積去除當前元素再進行替換,這樣就非常簡單,但是可能存在值為0的元素,這時候需要區分對待
    • 當沒有0的時候,直接進行除就可以了。
    • 當只有一個0的時候,為0的那位元素替換為其他元素的乘積,其他元素替換為0。
    • 當0的數量大于等于2的時候,排除任何一個元素都會存在與0相乘的情況,所以全部替換為0即可。
  3. 加上以上兩個條件之后,需要重新考慮了。可以想到,每個位置的元素結果應該為其左側所有元素乘積再乘其右側所有元素乘積,所以現在需要考慮如何分別獲取并儲存每個元素兩側元素的乘積結果。

代碼:

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int N = nums.length;
        int[] res = new int[N];   //創建一個額外空間,用于存儲獲取到的兩側元素乘積結果

        int l = 1;
        for(int i = 0; i < N ; i++){  //先進行循環,獲取每個元素左側元素的乘積
            res[i] = l;   //l用于保存每個元素左側元素乘積結果
            l *= nums[i];   //獲取下一次需要的值
        }
       
        int r = 1;
        for(int i = N-1; i >= 0 ; i--){   //再次循環,獲取當前位置對應元素的右側元素乘積,然后把獲取到的結果進行修改
            res[i] *= r;   //r值用于保存每個元素右側的元素乘積,本身res最后一位就是
            r *= nums[i];   //獲取到乘積之后進行修改
        }
        return res;  //返回最終結果
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,776評論 0 33
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 問題: Given an array of n integers where n > 1, nums, retur...
    Cloudox_閱讀 300評論 0 0
  • 同事家的孫子喜歡佩奇和喬治,給寶寶畫一個,兩個多小時,最后草地都不想涂勻了,就當它是一種風格吧
    Dianne1閱讀 293評論 2 1
  • 在iOS8之后,蘋果對應用的沙盒目錄進行了修改,將每次打開App的沙盒重新生成,并且將上一次的沙盒文件移到新生成的...
    青戟沉沙閱讀 594評論 0 0