1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public int[] productExceptSelf(int[] nums) { int[] result = new int[nums.length]; result[0] = 1; for (int i = 1; i < result.length; i++) { result[i] = result[i - 1] * nums[i - 1]; } int rightProduct = 1; for (int i = nums.length - 2; i >= 0; i--) { rightProduct = rightProduct * nums[i + 1]; result[i] = rightProduct * result[i]; } return result; } }
|
这个题很经典. 思路是假设第n个元素要计算左右的product, 我们发现算n - 1的时候, 它左边的product已经算过一次. 到了第n个我们还要重新从头乘一遍吗? 如果我们知道n - 1算好的它左边元素的乘积, 让这个值乘以第n - 1个元素, 不就是第n个元素左边元素的product的积. 右边的类似. 如果知道第n + 1个元素右边所有元素的product, 那么这个值再乘以n第 + 1个元素不就是第n个元素右边所有元素的乘积.
时间复杂度: O(n)
空间复杂度: O(1) 题目规定, result这个数组不计入空间复杂度的计算里面.