【题目】
给定一个整型数组arr,返回不包含本位置值的累乘数组
例如,arr=[2,3,1,4],返回[12,8,24,6]
【要求】
时间复杂度为O(N),除需要返回的结果数组外,额外空间复杂度为O(1)
【进阶题目】
要求不变,而且不可以使用除法
【代码】
public class demo {
public static void main(String[] args) {
int[] arr={2,3,1,4};
int[] res=plus3(arr);
for(int i:res){
System.out.println(i);//12,8,24,6
}
}
//不包含本位置值的累乘数组
public static int[] plus(int[] arr){
if(arr==null||arr.length==0){
return null;
}
int count=0;//用除法要考虑数0的个数!
int total=1;//总乘积
for(int i=0;i<arr.length;i++){
if(arr[i]!=0){
total*=arr[i];
}
else{
count++;
}
}
int[] res=new int[arr.length];
//情况1:没有一个0
if(count==0){
for(int i=0;i<arr.length;i++){
res[i]=total/arr[i];
}
}
//情况2:有一个0,则该元素上的res[i]为total,其他位置是0
if(count ==1){
for(int i=0;i<arr.length;i++){
if(arr[i]==0){
res[i]=total;
}
}
}
//情况3:不止一个0,则全部元素都为0,即不赋值即可
return res;
}
// 不包含本位置值的累乘数组
public static int[] plus2(int[] arr) {
if (arr == null || arr.length == 0) {
return null;
}
int[] res = new int[arr.length];
int[] arr2 = new int[2 * arr.length];
// 拼接数组,res[i]就是后面几个元素的乘积,但额外空间复杂度不满足要求
for (int i = 0; i < arr.length; i++) {
arr2[i] = arr[i];
}
for (int i = 0; i < arr.length; i++) {
arr2[arr.length + i] = arr[i];
}
int total = 1;
for (int i = 0; i < arr.length; i++) {
int count = arr.length - 1;
int j = i + 1;
res[i] = 1;
while (count-- != 0) {
res[i] *= arr2[j++];
}
}
return res;
}
// 不包含本位置值的累乘数组
public static int[] plus3(int[] arr) {
if (arr == null || arr.length == 0) {
return null;
}
int[] res = new int[arr.length];
// res[i]就是左边的累积*右边的累积
res[0]=arr[0];
//左边的累积:lr[i]=arr[0...i]的累积,用res作辅助数组
for (int i = 1; i < arr.length; i++) {
res[i] = res[i-1] * arr[i];
}
int temp=1;
//右边的累积:rl[i]=arr[i...N-1]的累积,存到temp
//调整res为结果输出
for (int i = arr.length-1; i >0; i--) {
res[i] = res[i - 1] * temp;
//第一次:res[N-1]=lr[N-2]
temp*=arr[i];//右边的累积
}
res[0]=temp;//res[0]=rl[1]
return res;
}