zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    6个实例详解如何把if-else代码重构成高质量代码
    Fiddler抓包工具总结
    thinkphp5 图片上传七牛云
    mysql事件(定时任务)处理超时失效订单
    修改PhpStorm创建Php类文件时头部作者
    sed理论讲解、实战
    sed实战、find实战、grep实战
    通配符、正则表达式、python去重
    python3:requests模块-写了一点
    《流畅的Python》一副扑克牌中的难点
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10088679.html
Copyright © 2011-2022 走看看