LeetCode刷題記錄——day2

想成为编程高手的阿曼發表於2024-03-20

https://leetcode.cn/problems/product-of-array-except-self/description/?envType=study-plan-v2&envId=top-interview-150
問題在於不使用除法並且空間複雜度為O(1),當第一次從頭開始遍歷時由於不知道後續陣列元素是什麼,所以無法得到答案,而如果當知道一個後續陣列元素後,又回去更新答案的話,無疑會提高時間複雜度。不妨這樣看待,如果我們已經遍歷一次陣列並且能夠記錄下足夠的資訊的話,那麼下次我們再次遍歷陣列時不就可以相對地知道後續元素的資訊了嗎。由此推廣,為了演算法簡單一些,我們甚至可以遍歷有限次,獲得足夠的資訊,然後一次得到最終答案。
由這樣的思路我們再看問題,對於任何一個元素,其除了自身以外的的元素的乘積由兩個部分構成,一個是它的前序元素乘積,一個是後續元素乘積。前者可以透過正向的遍歷得到,後者透過反向遍歷也可以得到,由此答案就明瞭了;

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

同理,其實我們不需要兩個陣列,只需要一箇中間變數記錄後續乘積的過程就可以了,這樣可以減小空間複雜度;

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

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章