這題有點類似 Prefix Sums 的概念,目標是找到陣列中元素自己以外的所有元素的乘績,放在一個新的陣列裡,雖然有三個迴圈是 O(3n)
的時間複雜度,但常數項通常會被省略,因此該演算法可達 O(n)
的時間複雜度,這裡有 JAVA 和 Python 的寫法。
Given an integer array
nums
, return an arrayanswer
such thatanswer[i]
is equal to the product of all the elements ofnums
exceptnums[i]
.
The product of any prefix or suffix ofnums
is guaranteed to fit in a 32-bit integer.
You must write an algorithm that runs inO(n)
time and without using the division operation.
給定一個整數陣列
nums
,回傳一個陣列answer
,其中answer[i]
等於所有元素的乘積,除了nums[i]
保證nums
陣列中任何的前後綴都適合 32-bit 的整數
你必須寫出一個時間複雜度為O(n)
的算法且不能使用除法
題目連結:https://leetcode.com/problems/product-of-array-except-self/
2 <= nums.length <= 105
30 <= nums[i] <= 30
The product of any prefix or suffix of nums
is guaranteed to fit in a 32-bit integer.
Input: nums = [1,2,3,4]
Output: [24,12,8,6]
nums [0] ⇒ 把 2、3、4 都乘起來
nums [1] ⇒ 把 1、3、4 都乘起來
(以此類推)
把全部乘完的元素都放在 answer
裡
Input: nums = [-1,1,0,-3,3]
Output: [0,0,9,0,0]
nums [0] ⇒ 把 1、0、-3、3 都乘起來
nums [1] ⇒ 把 -1、0、-3、3 都乘起來
(以此類推)
把全部乘完的元素都放在 answer
裡
- 簡而言之我們要把除了
nums[i]
以外的元素乘起來,並且對每一個i
做一樣的事情- 然後每個索引之前之後的元素都要相乘,就是
自己前面的乘積
*自己後面的乘積
class Solution {
public int[] productExceptSelf(int[] nums) {
int left[] = new int[nums.length]; // 前綴乘積
int right[] = new int[nums.length]; // 後綴乘積
int answer[] = new int[nums.length];
left[0] = 1; // 第一個元素設為 1
right[nums.length-1] = 1; // 陣列最後一個元素設為 1
for (int i = 1; i < nums.length; i++){
left[i] = nums[i - 1] * left[i - 1]; // left = [1, 1, 2, 6]
};
// 計數器 i 從陣列後面遞減回來
for (int i = nums.length-2; i >= 0; i--){
right[i] = nums[i + 1] * right[i + 1]; // right = [24, 12, 4, 1]
};
// 把兩個陣列的乘積相乘
for (int i = 0; i < nums.length; i++){
answer[i] = left[i] * right[i];
};
return answer;
}
}
使用了和 Java 一樣的邏輯執行,換成 Python 的寫法。
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
left, right, answer = [0] * len(nums), [0] * len(nums), [0] * len(nums)
left[0] = 1 # 第一個元素設為 1
right[len(nums)-1] = 1 # 陣列最後一個元素設為 1
for i in range(1, len(nums)):
left[i] = nums[i-1] * left[i-1]
# 計數器 i 從陣列後面遞減回來
for i in range(len(nums)-2, -1, -1):
right[i] = nums[i+1] * right[i+1]
# 把兩個陣列的乘積相乘
for i in range(len(nums)):
answer[i] = left[i] * right[i]
return answer
Language | Runtime | Memory |
---|---|---|
Java | 2ms | 53.43MB |
Python | 202ms | 25.48MB |
(新手上路,如有錯誤請友善告知,感謝) |
Blog
https://chris81051.github.io/2023/10/28/LeetCode-238-Product-of-Array-Except-Self-Java-Python/
有分享技術文章、科技新聞、日常生活,歡迎一起討論