Given an array nums of n integers where n > 1, return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].
Example:
Input: [1,2,3,4] Output: [24,12,8,6]
Constraint: It's guaranteed that the product of the elements of any prefix or suffix of the array (including the whole array) fits in a 32 bit integer.
Note: Please solve it without division and in O(n).
Follow up:
Could you solve it with constant space complexity? (The output array does not count as extra space for the purpose of space complexity analysis.)
문제 풀이
1 누적곱
누적합과 유사하게 누적곱을 사용하면 문제를 쉽게 풀 수 있다.
left배열과 right배열을 만들어서 left[i]는 i이전 인덱스의 수를 모두 곱한 값, right[i]는 i이후 인덱스의 수를 모두 곱한 값을 저장한다.
결과는 left[i] * right[i]로 나타낼 수 있다.
쉽지만 메모리가 많이 필요하다.
class Solution {
public int[] productExceptSelf(int[] nums) {
int len = nums.length;
int[] result = new int[len];
int[] left = new int[len];
int[] right = new int[len];
left[0] = 1;
for(int i=1; i<len; i++){
left[i] = left[i-1] * nums[i-1];
}
right[len-1]=1;
for(int i = len-2; i>-1; i--){
right[i] = right[i+1]*nums[i+1];
}
for(int i=0; i<len; i++){
result[i] = left[i] * right[i];
}
return result;
}
}
2 원리는 같은데 space complexity를 약간 줄임..
배열을 하나만 만들어서 누적곱을 변수에 저장한게 다다.
class Solution {
public int[] productExceptSelf(int[] nums) {
int len = nums.length;
int[] result = new int[len];
result[0] = 1;
for(int i=1; i<len; i++){
result[i] = result[i-1] * nums[i-1];
}
int right = 1;
for(int i = len-1; i>-1; i--){
result[i] *= right;
right *= nums[i];
}
return result;
}
}
'알고리즘 문제풀이 > leetcode' 카테고리의 다른 글
[leetcode 169] Majority Element (0) | 2020.11.01 |
---|---|
[leetcode 236] Lowest Common Ancestor of a Binary Tree (0) | 2020.10.31 |
[leetcode 234] Palindrome Linked List (0) | 2020.10.31 |
[leetcode 226] Invert Binary Tree (0) | 2020.10.30 |
[leetcode 49] Group Anagrams (0) | 2020.10.30 |
댓글