LeetCode(6),除自身以外数组的乘积

460 阅读1分钟

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

示例:

输入: [1,2,3,4] 输出: [24,12,8,6]

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

进阶: 你可以在常数空间复杂度内完成这个题目吗?(出于对空间复杂度分析的目的,输出数组不被视为额外空间。)

简单的思路就是对于数组中每一个元素nums[i],求得他的左边元素的乘积,然后求得它右边元素的乘积,最后得出结果。代码如下:

/**
 * @param Integer[] $nums
 * @return Integer[]
 */
function productExceptSelf($nums) {
    $n = count($nums);
    $left_product[0] = 1;
    for ($i=1; $i < $n; $i++) { 
        $left_product[$i] = $nums[$i-1]*$left_product[$i-1];
    }
    $right_product[$n-1] = 1;
    for ($i=$n-2; $i >=0 ; $i--) { 
        $right_product[$i] = $nums[$i+1]*$right_product[$i+1];
    }

    for ($i=0; $i < $n; $i++) { 
        $result[$i] = $left_product[$i]*$right_product[$i];
    }
    return $result;
}

看了别人的答案,发现有更好的算法:

function productExceptSelf($nums) {
    $n=count($nums);
    $res=array_fill(0,$n,1);
    $l=1;$r=1;
    for ($i=0;$i<$n;$i++){
        $res[$i]*=$l;
        $res[$n-$i-1]*=$r;
        $l*=$nums[$i];
        $r*=$nums[$n-$i-1];
    }
    return $res;
}