LeetCode--238除自身以外數組的乘積-左累乘右累乘-cpp

LeetCode-day44-238除自身以外數組的乘積-左累乘右累乘-cpp

題目回顧

傳送門

給定長度爲 n 的整數數組 nums,其中 n > 1,返回輸出數組 output ,其中 output[i] 等於 nums 中除 nums[i] 之外其餘各元素的乘積。

示例:

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

說明: 請不要使用除法,且在 O(n) 時間複雜度內完成此題。

進階:
你可以在常數空間複雜度內完成這個題目嗎?( 出於對空間複雜度分析的目的,輸出數組不被視爲額外空間。)

題解

參考題解
時間複雜度: O(N)O(N)
空間複雜度O(N)O(N)
執行用時:56ms56 ms

乘積 = 當前數左邊的乘積 * 當前數右邊的乘積

開闢一個n的新數組res,

一個循環,累積相乘,得到每個res[i],類似n!,

第二次循環從尾部開始累積相乘,並乘以對應位置的新數組res[i]

res[i]=0i1res[j]ni+1res[j]res[i]=\prod_{0}^{i-1}{res[j]}*\prod_{n}^{i+1}{res[j]}

公式可能有誤

cpp

#include<iostream>
#include<vector>
using namespace std;

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        if(nums.size()<=1){
            return nums;
        }
        vector<int> vec;
        int k=1;
        //左乘累積
        for(int i=0;i<nums.size();i++){
            vec.push_back(k);
            k*=nums[i];
        }
        k=1;
        //右乘累積並乘以上一輪左乘後的結果
        for(int i=nums.size()-1;i>=0;i--){
            vec[i]*=k;
            k*=nums[i];
        }
        return vec;        
    }
};


int main(){

    Solution sol=Solution();
    vector<int> vec={1,2,3,4};

    // expect result is  [24 12 8 6]
    vector<int> vec2=sol.productExceptSelf(vec);
    for(int i=0;i<vec2.size();i++){
        cout<<vec2[i]<<" ";        
    }
    
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章