zoukankan      html  css  js  c++  java
  • [LeetCode] 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.)

    题意:给一数组,输出除了这个数字以外所有数字的乘积

    注意,不用除法(其实你用了它也不会报错),尽可能在常数级的空间内解决问题。

    如果用除法大家肯定都会,不用除法,而且要在O(n)的条件下完成。

    我们会到问题,关键有两点,数组和乘积,这个位置的答案可以看作是它左边所有数字的积乘以它右边数字的积

    那么我们就需要额外开两个数组,分别从左向右 从右向左乘一次,最后在乘一次即可

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

     哈哈,这不满足常数空间的要求(也可以说就是O(1)空间的要求)

    不能额外开空间,所以我们优化一下,一边计算一边记录

    从右向左的,我们保存到res里,从左向右的,我们用一个int代替就行了(这样不会影响res中没有用的元素)

    class Solution {
        public int[] productExceptSelf(int[] nums) {
            int[] res = new int[nums.length];
            res[nums.length - 1] = nums[nums.length - 1];
    
            for (int i = nums.length - 2; i >= 0; i--) {
                res[i] = res[i + 1] *nums[i];
            }
            res[0] = res[1];
            int mix = nums[0];
            for (int i = 1; i < nums.length - 1; i++) {
                res[i] = mix * res[i + 1];
                mix *= nums[i];
            }
            res[nums.length - 1] = mix;
            return res;
        }
    }
  • 相关阅读:
    python中常用的数据类型之整型(int),浮点型(float), 布尔值(bool), 复数(complex)
    requests库的基础使用
    socket,urllib,urllib3,request多种方法请求网页首页
    nginx日志切割
    gitlab社区版安装
    批量修改文件编码
    lvm磁盘扩展及添加磁盘lvm分区
    函数
    集合
    数据类型练习题
  • 原文地址:https://www.cnblogs.com/Moriarty-cx/p/9785609.html
Copyright © 2011-2022 走看看