zoukankan      html  css  js  c++  java
  • leetcode238- Product of Array Except Self- medium

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

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

    两个数组,一个存从最左边直到前一个数字的乘积,一个从最右边直到后一个数字的乘积。最后的答案就是这两个数组对应位置相乘。

    空间优化,可以直接左边一次把第一个数组乘到最终结果里,右边扫一次把第二个数组乘到最终结果里。

    1.空间优化后

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

    2.空间优化前

    class Solution {
        public int[] productExceptSelf(int[] nums) {
            
            if (nums == null || nums.length == 0) {
                return new int[0];
            }
            
            int[] forward = new int[nums.length];
            int[] backward = new int[nums.length];
            int[] result = new int[nums.length];
            
            forward[0] = 1;
            for (int i = 1; i < nums.length; i++) {
                forward[i] = forward[i - 1] * nums[i - 1];
            }
            backward[nums.length - 1] = 1;
            for (int i = nums.length - 2; i >= 0; i--) {
                backward[i] = backward[i + 1] * nums[i + 1];
            }
            
            for (int i = 0; i < nums.length; i++) {
                result[i] = forward[i] * backward[i];
            }
            return result;
        }
    }
  • 相关阅读:
    【数据结构与算法】C++Vector常用备忘
    【数据结构与算法】C++String常用备忘
    【JAVA】几个collection框架
    【JAVA】创建一维数组+创建二维数组
    DNN 错误代码 0x80070005 解决方案
    ehcache
    redis
    MySql优化—删除操作
    MySql优化过程及原理
    如何查看MySQL的执行计划
  • 原文地址:https://www.cnblogs.com/jasminemzy/p/7839179.html
Copyright © 2011-2022 走看看