给定长度为 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;
}