• 238. Product of Array Except Self


    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]
    

    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.)

    (类似)dp

    每一个元素的对应值 等于 它左边所有元素的乘积 * 它右边所有元素的乘积

    用res[i]表示每一个元素对应值。元素nums[i]左边所有元素的乘积是left[i-1] * nums[i-1],第一个元素左边没有元素,即乘积为1,left[0] = 1,遍历一遍得到元素左边所有元素的乘积。同样,元素nums[i]右边所有元素的乘积是right[i+1] * nums[i+1],最后一个元素右边没有元素,即乘积为1,right[nums.length-1] = 1。最后再把left[i] * right[i] 得到res[i]

    time: O(n), space: O(n)

    class Solution {
        public int[] productExceptSelf(int[] nums) {
            if(nums == null || nums.length == 0) return nums;
            int[] left = new int[nums.length];
            int[] right = new int[nums.length];
            int[] res = new int[nums.length];
            
            left[0] = 1;
            for(int i = 1; i < nums.length; i++) {
                left[i] = left[i-1] * nums[i-1];
            }
            
            right[nums.length - 1] = 1;
            for(int i = nums.length - 2; i >= 0; i--) {
                right[i] = right[i+1] * nums[i+1];
            }
            
            for(int i = 0; i < nums.length; i++) {
                res[i] = left[i] * right[i];
            }
            return res;
        }
    }

    优化:只用一个res array, space complexity O(1)

    class Solution {
        public int[] productExceptSelf(int[] nums) {
            if(nums == null || nums.length == 0) return 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 right = 1;
            for(int i = nums.length - 1; i >= 0; i--) {
                res[i] *= right;
                right *= nums[i];
            }
            return res;
        }
    }
  • 相关阅读:
    PowerDesigner使用教程(一)
    为自己的博客园增加打赏功能[只需五步]
    [Python自学] DRF (4) (权限组件和频率组件)
    [Python自学] DRF (3) (认证组件)
    [Python自学] DRF (2) (视图类的封装)
    [踩坑] Django "OverflowError: Python int too large to convert to C long" 错误
    [Python自学] DRF (1)
    [Python自学] 设计模式之单例模式
    [Python自学] Django的admin组件
    [Python自学] Django的认证系统
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10088679.html
Copyright © 2020-2023  润新知