LeetCode 238 Product of Array Except Self

Given an array of n integers where n > 1, nums, return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].
Solve it without division and in O(n).數組

For example, given [1,2,3,4], return [24,12,8,6].spa

Follow up:
Could you solve it with constant space complexity? (Note: The output array does not count as extra space for the purpose of space complexity analysis.)指針

有三種狀況:
數組元素不含0,像[1,2,3,4], return [24,12,8,6]
數組元素有1個0,[1,0,3,4], return [0,12,0,0],是0的那個位置是其餘元素的乘積
數組元素有2個或者2個以上0,[1,0,0,4]則返回[0,0,0,0],返回所有是0.code

public class ProductArrayExceptSelf {
    public int[] solution(int[] nums) {
        int zeroCount = 0;
        for (int n : nums)
            if (n == 0)
                zeroCount++;
        // 有兩個或者兩個以上的元素是0,那麼數組設爲全零返回
        if (zeroCount > 1) {
            for (int i = 0; i < nums.length; i++)
                nums[i] = 0;
        } else if (zeroCount == 0) {
            // 若是沒有0,則計算全部的乘積
            int product = 1;
            for (int n : nums)
                product *= n;
            // 每一個數組元素置爲product / 該位置值便可
            for (int i = 0; i < nums.length; i++)
                nums[i] = product / nums[i];
        } else {
            // 若是元素中有1個0
            int product = 1;
            // 跳過那個元素,計算全部的乘積
            for (int n : nums)
                if (n != 0)
                    product *= n;
            // 元素爲0的位置置爲product,其餘置爲0
            for (int i = 0; i < nums.length; i++)
                if (nums[i] == 0)
                    nums[i] = product;
                else
                    nums[i] = 0;
        }
        return nums;
    }

    public static void main(String[] args) {
        System.out.println(Arrays.toString(new ProductArrayExceptSelf().solution(new int[] { 1, 0, 3, 0 })));
    }
}

補上one pass 且不用除法, o(n)解法。
使用左右指針,一遍遍歷便可element

public int[] solution2(int[] nums) {
        int[] result = new int[nums.length];
        Arrays.fill(result, 1);
        int left = 1, right = 1;
        int len = nums.length;
        for (int i = 0; i < len; i++) {
            result[i] *= left;
            result[len - 1 - i] *= right;
            left *= nums[i];
            right *= nums[len - i - 1];
            //System.out.println(Arrays.toString(result));
        }
        return result;
    }
相關文章
相關標籤/搜索