본문 바로가기
알고리즘 문제풀이/leetcode

[leetcode 238] Product of Array Except Self

by m2162003 2020. 10. 31.

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;
    }
}

댓글