核心思想:无,就是个很巧妙地推导 思路: 由于题目说,输出结果数组ans不算额外空间,所以可以利用这个ans数组来存储其他信息。 首先,令ans[0]=1,从左向右开始遍历数组nums,然后,每个位置i上的数值为前一位置ans[i-1]和nums[i-1]的乘积,本次遍历结束之后,得到每个位置的左边的元素乘积; 之后,借助元素r=1,开始从右向左开始遍历,每次更新r值,r=r*nums[i],这样便能在每次遍历中存储每一位置的当前的右边元素乘积,这就是nums[0] * … * nums[i-1] * …num[i+1]…,其中ans数组存储左边子元素乘积,r存储右边子元素乘积。
class Solution {
public int[] productExceptSelf(int[] nums) {
int[] answer = new int[nums.length];
answer[0] = 1;
for(int i = 1; i < nums.length; i++){
answer[i] = answer[i - 1] * nums[i - 1];
}
int r = 1;
for(int i = nums.length - 1; i >= 0; i--){
answer[i] = answer[i] * r;
r = r * nums[i];
}
return answer;
}
}
|