swift算法:除自身以外数组的乘积

1、描述

给定长度为n的整数数组nums,其中n>1,返回输出数组 output,其中output[i] 等于nums中除 nums[i] 之外其余各元素的乘积。

说明:请不要使用除法,且在O(n)时间复杂度内完成

实例:输入:[1, 2, 3, 4]

            输出:[24, 12, 8, 6]

 

2、算法

思想:上三角、下三角,乘积 = 当前数左边的乘积 * 当前数右边的乘积

          1)因为空间复杂度要求O(1)、不能使用除法,因此一定需要在乘法过程中得到所有答案;

          2)我们可以将res数组列成乘积形式,形成一个矩阵,可以发现矩阵次主角线全部为1(因为当前数字不相乘,因此等价为乘1);

         3)因此,我们分别计算矩阵的上三角和下三角,并且在计算过程中储存过程值,最终可以在遍历2遍nums下完成结果计算。

res     
res[0] = 1num[1]...num[n-2]num[n-1]
res[1] = num[0]... num[n-2]num[n-1]
...    ... ... ... num[n-2]num[n-1]
res[n-2] =num[0]num[1]... 1num[n-1]
res[n-1] = num[0]num[1]... num[n-2]1

       

func productExceptSelf2(_ nums: [Int])->[Int]{
        /*
         上三角、下三角
         */
        var res: [Int] = [Int].init(repeating: 0, count: nums.count)
        var p = 1
        var q = 1
        for i in 0..<nums.count {
            res[i] = p
            p *= nums[i]
        }
        for i in (1...nums.count-1).reversed() {
            q *= nums[i]
            res[i-1] *= q
        }
        return res
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值