構建乘積陣列
給定乙個陣列a[0,1,…,n-1]
,請構建乙個陣列b[0,1,…,n-1]
,其中b
中的元素b[i]=a[0]×a[1]×…×a[i-1]×a[i+1]×…×a[n-1]
。不能使用除法。
示例:
輸入:[1,2,3,4,5]輸出:[120,60,40,30,24]
方法一:暴力(超時)
public int constructarr(int a) }}
return b;
}
在計算乘積的過程中存在重複計算
方法二:左右乘積陣列
先考慮可以使用除法的情況
left[i] = a[0]...a[i-1]
right[i] = a[i+1]...a[n-1]
所以:b[i] = left[i] * right[i]
在遍歷的過程中,左部分乘積增大,右部分乘積減小
public int constructarr(int a)
for (int i = 0; i < b.length; i++)
return b;
}
由於存在元素為0,除法會出錯
public int constructarr(int a)
zerocount++;
} else
}for (int i = 0; i < b.length; i++)
right /= a[i];
b[i] = left * right;
left *= a[i];
}return b;
}
由於不能用除法,可以先將左右乘積的值計算出來,在計算過程中利用前乙個值減少重複計算
left[i]=left[i-1]×a[i-1]
right[i]=right[i+1]×a[i+1]
b[i]=left[i]×right[i]
public int constructarr(int a)
int b = new int[a.length];
int left = new int[a.length];
int right = new int[a.length];
left[0] = 1;
right[a.length - 1] = 1;
for (int i = 1; i < a.length; i++)
for (int i = a.length - 2; i >= 0; i--)
for (int i = 0; i < a.length; i++)
return b;
}
方法三:左(或右陣列)
不再使用額外空間
第一次遍歷:用結果陣列b儲存左部分乘積
第二次遍歷:從右往左,b[i]乘上右部分乘積
public int constructarr(int a)
int b = new int[a.length];
b[0] = 1;
int right = 1;
for (int i = 1; i < a.length; i++)
for (int i = a.length - 1; i >= 0; i--)
return b;
}
構建乘積陣列
給定乙個陣列a 0,1,n 1 請構建乙個陣列b 0,1,n 1 其中b中的元素b i a 0 a 1 a i 1 a i 1 a n 1 不能使用除法。思路 這題我原本的方法比較暴力,複雜度為o n 2 後參考劍指的方法,複雜度降為o n 涉及到這種容易重複計算的要考慮用空間記錄前列的結果 陣列乘...
構建乘積陣列
題目描述 給定乙個陣列a 0,1,n 1 請構建乙個陣列b 0,1,n 1 其中b中的元素b i a 0 a 1 a i 1 a i 1 a n 1 不能使用除法。思路 類似於動態規劃 用兩個陣列儲存 v1中v1 i 儲存前i 1個數的乘積 v1 0 1 然後從前往後遍歷v i v i 1 a i ...
構建乘積陣列
題目描述 給定乙個陣列a 0,1,n 1 請構建乙個陣列b 0,1,n 1 其中b中的元素b i a 0 a 1 a i 1 a i 1 a n 1 不能使用除法。構建乘積陣列 author 過路的守望 public class multiplyarray new multiplyarray get...