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

    class Solution { //O(n)
        public int[] productExceptSelf(int[] nums) {
            int[] res = new int[nums.length];
            int[] left = new int[nums.length];
            int[] right = new int[nums.length];
            left[0] = 1;
            right[nums.length-1] = 1;
            for(int i = 1; i < nums.length; i++){
                left[i] = left[i-1] * nums[i-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;
        }
    }

    我们以一个4个元素的数组为例,nums=[a1,a2,a3,a4],要想在O(n)的时间内输出结果,比较好的解决方法是提前构造好两个数组:

    • [1, a1, a1*a2, a1*a2*a3]
    • [a2*a3*a4, a3*a4, a4, 1]

    然后两个数组一一对应相乘,即可得到最终结果 [a2*a3*a4, a1*a3*a4, a1*a2*a4, a1*a2*a3]

    不过,上述方法的空间复杂度为O(n),可以进一步优化成常数空间,即用一个整数代替第二个数组。'

    public class Solution {//O(1)
        public int[] productExceptSelf(int[] nums) {
            final int[] left = new int[nums.length];
            left[0] = 1;
    
            for (int i = 1; i < nums.length; ++i) {
                left[i] = nums[i - 1] * left[i - 1];
            }
    
            int right = 1;
            for (int i = nums.length - 1; i >= 0; --i) {
                left[i] *= right;
                right *= nums[i];
            }
            return left;
        }
    }
  • 相关阅读:
    java表达式, 语句, 块(翻译自Java Tutorials)
    java控制流语句(翻译自Java Tutorials)
    你可以将使用搬到ubuntu上
    python进阶学习笔记(三)
    译:selenium webdriver (python)
    异步调用轻量级封装AsynCaller
    企业开发基础设施--事件通知服务(Remoting双向通信)
    企业开发基础设施--序
    关于跨程序集的反射
    异常处理经验谈
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/11318843.html
Copyright © 2011-2022 走看看