https://leetcode.com/problems/product-of-array-except-self

 

int [ ] answer;

answer [i] = nums에서 i 위치를 제외한 모든 원소의 곱

O(n)의 시간복잡도와 나눗셈 연산 없이 해결해야 한다.

가장 쉬운 방법은 모든 원소의 곱을 구하고 순회하며 나눗셈 연산을 하는 것이다.

하지만 나눗셈은 사용하면 안 되는 조건이 있다.

그렇다면 자신을 제외한 왼쪽곱, 오른쪽곱의 배열을 만들어 두 배열의 값을 곱해서 반환하면 된다.

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int[] left = new int[nums.length];
        Arrays.fill(left, 1);
        int p = 1;
        for (int i = 1; i < nums.length; i++) {
            left[i] = p * nums[i - 1]; 
            p *= nums[i - 1];
        }
        
        p = 1;
        int[] right = new int[nums.length];
        Arrays.fill(right, 1);
        for (int i = nums.length - 2; i >= 0; i--) {
            right[i] = p * nums[i + 1];
            p *= nums[i + 1];
        }

        int[] answer = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            answer[i] = left[i] * right[i];
        }

        return answer;
    }
}

그런데 위의 풀이를 보면 left, right, answer라는 추가 공간이 많이 사용됐다.

생각해 보면 그냥 answer 배열 하나에 다 처리를 해도 될 것 같다.

또한 배열을 1로 채워주고 있는데 시작 지점만 채워주면 된다.

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;
        int[] answer = new int[n];

        answer[0] = 1;
        for (int i = 1; i < n; i++) {
            answer[i] = answer[i - 1] * nums[i - 1];
        }

        int right = 1;
        for (int i = n - 1; i >= 0; i--) {
            answer[i] *= right;
            right *= nums[i];
        }

        return answer;
    }
}

'Algorithm > LeetCode' 카테고리의 다른 글

LeetCode 150 - Candy  (1) 2024.09.30
LeetCode 134 - Gas Station  (1) 2024.09.29
LeetCode 380 - Insert Delete GetRandom O(1)  (0) 2024.09.29
LeetCode 274 - H-Index  (0) 2024.09.29
LeetCode 45 - Jump Game2  (0) 2024.09.29

+ Recent posts