题目:
Given an array of n integers where n > 1, nums
,
return an array output
such that output[i]
is
equal to the product of all the elements of nums
except nums[i]
.
Solve it without division and in O(n).
For example, given [1,2,3,4]
, return [24,12,8,6]
.
Follow up:
Could you solve it with constant space complexity? (Note: The output array does not count as extra space for the purpose of space complexity analysis.)
分析:
class Solution {
public int[] productExceptSelf(int[] nums) {
//给定数组,返回的是全数组所有元素之积(但是不包括当前该元素),不能使用除法。
//注意:1.积的长度可能会越界。2.以及长度太长,超时
//思路:传统分两部分(前和后)容易超时,需要跳过相同的数据,使用HashMap,相同的数据,直接赋值相同。
int [] res=new int [nums.length];
HashMap<Integer,Integer> hm=new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
//跳过相同的
if(hm.containsKey(nums[i])){
//存在相同项
res[i]=hm.get(nums[i]);
}else{
//不存在,将结果压入map,作为记录
int temp=1;
for(int head=0;head<i;head++){
temp*=nums[head];
}
for(int tail=i+1;tail<nums.length;tail++){
temp*=nums[tail];
}
res[i]=temp;
hm.put(nums[i],temp);
}
}
return res;
}
}
分析2(推荐):
class Solution {
public int[] productExceptSelf(int[] nums) {
//参考答案解法:利用一个数组存入该数的前n-1个积。
int [] res=new int[nums.length];
int temp=1;
res[0]=1;
for(int i=1;i<nums.length;i++){
//前n-1个数对应的积和
res[i]=res[i-1]*nums[i-1];
}
int right=1;
for(int i=nums.length-1;i>=0;i--){
//从最末尾开始,末尾数的非它积为res[i]*1=res[i]
//倒数第2个数:它前n-1积和*倒数第一个数即它的非它积
//以此类推
res[i]*=right;
right*=nums[i];
}
return res;
}
}