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

思路

题目的意思是,要将这整个数组,针对每一个数字,求出除了该数字本身的剩下的数字的乘积。

同时要求线性时间复杂度和O(1)空间复杂度。

我们试想,通过从左往右的一遍扫描,能否得到当前数字之前的所有数字的乘积?答案是肯定的!我们可以申请一个等大的数组,第一个记录对应第一个元素的前面数字乘积,很显然是1(因为当前数字不算,而之前又没有数字,只能是1);往后递推,第二个记录对应除第二个元素之前的所有数字乘积,即需要刚才的1乘以刚才的第一个数字;以此类推,核心思想就是通过新的数组记录之前所有数字的乘积,属于动态规划。

从左往右遍历完成之后,新数组中对应数字的结果是所有左侧数字的乘积;那再从右往左便利一遍,再记录对应数字右侧所有数字的乘积,最终把两个数乘起来,不就得到想要的结果了吗。

从右往左乘的过程,其实没有必要再申请一个新的数组了,只需要申请个别变量记录当前值,在刚才的数组上做即可。因为,当前值只跟上一个值有关。

通过一左一右两次扫描,就能够得到所求结果了。

代码

public int[] productExceptSelf(int[] nums) {
        int[] rst = new int[nums.length];
        rst[0] = 1;
        for(int i=1;i<nums.length;i++){
            rst[i] = rst[i-1]*nums[i-1];
        }
        int n = nums[nums.length-1];
        for(int i=nums.length-2;i>=0;i--){
            rst[i] = rst[i] * n;
            n = n * nums[i];
        }

        return rst;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值