Problem
Input
배열이 주어졌을 때 Output
배열을 출력합니다.
Output
배열은 Input
배열과 길이가 같고 output[i]
는 input[i]
를 제외한 모든 input 배열 값들의 곱입니다.
Note 와 Follow up 을 보면 나누기를 쓰지 않고 O(n)
시간복잡도와 O(1)
공간복잡도로 구해야 합니다.
Solution
나누기를 쓰지 말라고 한 이유는 nums
배열의 모든 값을 곱한 뒤 for
문을 돌면서 / nums[i]
만 해주면 되기 때문입니다.
처음 위의 표를 Input
값 기준으로 왼쪽, 오른쪽으로 나누면 아래에 있는 표 처럼 바꿀 수 있습니다.
left -> right 에서는 이전 인덱스까지의 누적 곱을 넣어줍니다.
right -> left 에서는 반대방향으로 똑같이 곱해서 넣어줍니다.
처음에 Arrays.fill(res, 1)
를 사용하여 다 1 값으로 채운 뒤에 왼쪽에서 오른쪽으로 구할 때도 acc
변수를 사용했습니다.
그런데 Arrays.fill
하나 때문에 그런지 2ms 가 나와서 안쓰는 방향으로 구현했더니 1ms 100% 가 나왔습니다.
Java Code
class Solution {
public int[] productExceptSelf(int[] nums) {
int[] res = new int[nums.length];
res[0] = 1;
for (int i = 1; i < nums.length; i++) {
res[i] = res[i - 1] * nums[i - 1];
}
int acc = 1;
for (int i = nums.length - 2; i >= 0; i--) {
acc *= nums[i + 1];
res[i] *= acc;
}
return res;
}
}
'알고리즘 문제 > LeetCode' 카테고리의 다른 글
[LeetCode Medium] Group Anagrams (Java) (0) | 2021.01.01 |
---|---|
[LeetCode Medium] Rotate Image (Java) (0) | 2021.01.01 |
[LeetCode Medium] Kth Smallest Element in a BST (Java) (0) | 2020.12.31 |
[LeetCode Medium] Find First and Last Position of Element in Sorted Array (Java) (0) | 2020.12.31 |
[LeetCode Medium] Find All Anagrams in a String (Java) (0) | 2020.12.31 |