1. 程式人生 > >LeetCode238Product of Array Except Self

LeetCode238Product of Array Except Self

先上題目:

這裡寫圖片描述

題目大意:

給一陣列。返回一陣列,這個陣列對應原陣列除了對應數其他數的乘積和。注意為額外的O(n)空間

技巧:

題目中已經明確把最容易想到的求所有數乘積,然後分別除每一個數的簡單做法給否定了,因為這個也太沒技術含量了。。。

這裡要提及一個經常用到的概念,字首和字尾,這個概念對很多程式有至關重要的意義以後如果要介紹KMP演算法,其中就用到了字串字首和字尾的匹配。其實字首和字尾顧名思義我們可以把陣列中特定一位元素,如i位元素,規定i之前的元素乘積和為i的字首積,同理i之後的元素乘積和為i的字尾積,顯然輸出的陣列為字首積陣列再乘上字尾積陣列對應的元素。

如下圖所示

這裡寫圖片描述
這裡寫圖片描述

示例程式碼:

在例項程式碼中,我只用了兩個vector陣列,一個是結果的,一個是原有的,這破壞了原有的nums中的值,如果題目沒有要保持原有陣列的要求的話,這種實現又節省了一定的額外空間。

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

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        vector<int
>
prefix; int size = nums.size(); prefix.push_back(1); // 初值賦為1很關鍵 for (int i = 1; i < size; i++) { int temp = prefix[i-1]*nums[i-1]; prefix.push_back(temp); } int templast = nums[size-1]; // 這裡要記錄即將被修改的nums陣列值 nums[size-1
]=1; for (int i = 1; i < size; i++) { int temp = nums[size-i]*templast; templast = nums[size-i-1]; // 更新templast的值 nums[size-i-1] = temp; } for (int i = 0; i < size; i++) { prefix[i] *= nums[i]; } return prefix; } }; int main() { Solution s; vector<int> temp; int n; cin >> n; cout << endl << endl; for (int i = 0; i < n; i++) { int x; cin >> x; temp.push_back(x); } vector<int> printarray = s.productExceptSelf(temp); for (int i = 0; i < printarray.size(); i++) { cout << printarray[i] << " "; } cout << endl; getchar(); getchar(); return 0; }

執行截圖:

這裡寫圖片描述