LeetCode238Product of Array Except Self
阿新 • • 發佈:2018-12-11
先上題目:
題目大意:
給一陣列。返回一陣列,這個陣列對應原陣列除了對應數其他數的乘積和。注意為額外的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;
}