1. 程式人生 > 其它 >leetcode——除自身以外陣列的乘積

leetcode——除自身以外陣列的乘積

技術標籤:面試C++

題目:給你一個長度為n的整數陣列nums,其中n > 1,返回輸出陣列output,其中 output[i]等於nums中除nums[i]之外其餘各元素的乘積。

說明:

  • 題目資料保證陣列之中任意元素的全部字首元素和字尾(甚至是整個陣列)的乘積都在 32 位整數範圍內
  • 不要使用除法,且在O(n) 時間複雜度內完成此題。

示例:

輸入: [1,2,3,4]
輸出: [24,12,8,6]

方案一:除法

用到除法,就要檢驗除數是否為0

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int len = nums.size();
        int mul = 1;
        int zero_num = 0;
        for (int i = 0; i < len; i++) {
            if (nums[i] == 0) {
                zero_num++;
                continue;
            }
            mul *= nums[i];
        }
        vector<int> output = vector<int>(len);
        for (int i = 0; i < len; i++) {
            if (zero_num == 1) {
                if (nums[i] != 0) {
                    output[i] = 0;
                } else {
                    output[i] = mul;
                }
            } else if (zero_num > 1) {
                output[i] = 0;
            } else {
                output[i] = mul / nums[i];
            }
            
            
        }
        return output;
    }
};

時間複雜度O(n)

空間複雜度O(1)答案陣列,不算在空間複雜度內

方案二:左右乘積列表

陣列L: L[i]為nums[i] 左側所有元素乘積,其中L[0]=1

陣列R:R[i]為nums[i] 右側所有元素乘積,其中R[len - 1]=1

輸出陣列output[i] = L[i] * R[i]

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int len = nums.size();
        vector<int> left = vector<int>(len);
        vector<int> right = vector<int>(len);
        vector<int> output = vector<int>(len);
        left[0] = 1;
        for (int i = 1; i < len; i++) {
            left[i] = left[i - 1] * nums[i - 1]; 
        }
        right[len - 1] = 1;
        for (int i = len - 2; i >= 0; i--) {
            right[i] = right[i + 1] * nums[i + 1];
        }
        for (int i = 0; i < len; i++) {
            output[i] = left[i] * right[i];
        }
        return output;
    }
};

時間複雜度O(n)

空間複雜度O(n)

方案三:方案二優化,空間複雜度O(1)

省略L陣列空間,用output儲存L陣列。

然後動態計算R陣列的值。

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int len = nums.size();
        vector<int> output = vector<int>(len);
        output[0] = 1;
        for (int i = 1; i < len; i++) {
            output[i] = output[i - 1] * nums[i - 1]; 
        }
        int right = 1;
        output[len - 1] *= right;
        for (int i = len - 2; i >= 0; i--) {
            right *= nums[i + 1];
            output[i] *= right;
        }
        
        return output;
    }
};

時間複雜度O(n)

空間複雜度O(1)