• LeetCode 238. Product of Array Except Self (去除自己的数组之积)


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


    题目标签:Array 

      题目给了我们一个 nums array, 让我们返回一个新的output array, 每一个项都是 整个数组除了自己项的乘积。题目规定了不能用除法,而且要O(n) 和 constant space complexity。

      来分析一下,每一个数字 都需要除了自己以外的 所有数的 乘积。 那么可以从另一个角度来看, 每一个数字, 需要自己位置 左边的所有数字 乘积 * 右边的所有数字 乘积。

      我们可以通过两次遍历数组来实现这个目标:

      首先把output[0] 设为1, 方便*;

      第一次遍历,从第二个数字到最后一个数字: 把output里每一个数字 = nums这个数字 左边 的所有数字的乘积;结束后可以发现,output里最后一个数字的 乘积 已经完成了,因为最后一个数字 没有右边的数字;

      第二次遍历,从倒数第二个数字到第一个数字, 并且设一个product = nums 里最后一个数字: 把output里每一个数字 * product,还要更新product = product * nums里数字,这一次遍历相当于把每一个数字的剩下右边所有数字乘积补上。

      举例来看一下:

      [2, 3, 4, 5]  nums

      [1, 0, 0, 0]  output

      第一次遍历:

      [1, 2, 0, 0] 

      [1, 2, 6, 0]

      [1, 2, 6, 24]     结束第一次遍历;可以看出,第一次遍历同样有一个product 值,只不过直接保存在output里而已。

      第二次遍历:    product = 5;

      [1, 2, 30, 24]   更新product = 5 * 4;

      [1, 40, 30, 24]    更新product = 5 *4 * 3;

      [60, 40, 30, 24]  结束。

        

    Java Solution:

    Runtime beats 29.29% 

    完成日期:09/07/2017

    关键词:Array

    关键点:来回遍历两次   第一次从左到右 -> 把每一个数字 等于 这个数字左边的所有数字的乘积;

                 第二次从右到左 -> 把每一个数字 剩余的 右边所有数字乘积 补上

     1 class Solution 
     2 {
     3     public int[] productExceptSelf(int[] nums) 
     4     {
     5         // create output array
     6         int [] output = new int[nums.length];
     7         // make first number to 1
     8         output[0] = 1;
     9         
    10         // 1st iteration from 1 ~ end -> make each nums[i] = 0 ~ i-1 numbers product
    11         for(int i=1; i<nums.length; i++)
    12             output[i] = nums[i-1] * output[i-1];
    13         
    14         
    15         int product = nums[nums.length-1];
    16         // 2nd iteration from end - 2 ~ 0 -> make each nums[i] * (i+1 ~ end) numbers product 
    17         for(int i=nums.length-2; i>=0; i--)
    18         {
    19             output[i] *= product;
    20             product *= nums[i];
    21         }
    22         
    23         return output;
    24     }
    25 }

    参考资料:N/A

    LeetCode 算法题目列表 - LeetCode Algorithms Questions List

  • 相关阅读:
    通完古墓丽影9
    第一次咖喱牛肉饭
    游戏模块分析总结(1)之文化内涵篇
    《海岛奇兵》战斗系统分析
    通过坑、蒙、拐、骗、偷这5点,教你如何做好市场
    UNITY3D MAC版本破解
    使用cocos2d-x 3.2下载图片资源小例子
    REST四种请求(get,delete,put,post) 收集整理 之一
    Android SDK无法更新解决方法
    (mac)Android Studio安装以及Fetching android sdk component information超时的解决方案
  • 原文地址:https://www.cnblogs.com/jimmycheng/p/7492905.html
Copyright © 2020-2023  润新知