今天看到了兩道有關於前綴和應用的的算法題,解法挺巧妙的,分享給大家。
在這里直接放上我的代碼,題目和注釋在代碼解釋的都非常清楚。
1 /* 2 * 題目描述:給定一個數組a[N],我們希望構造數組b[N], 3 * 其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。 4 * 在構造過程:不允許使用除法;要求:O(1)空間復雜度和O(n)時間復雜度; 5 * 除遍歷計數器與a[N] b[N]外,不可使用新的變量(包括棧臨時變量、對空間和全局靜態變量等); 6 */ 7 class ConstructeAarry 8 { 9 public void ConstructeAarrySolution(double[] nums) 10 { 11 int length = nums.Length; 12 double[] result = new double[length];//存放結果 13 //先計算后綴積 14 for (int i = length - 1; i >= 0; i--) 15 { 16 result[i] = nums[i] * (i == length - 1 ? 1 : result[i + 1]); 17 } 18 //再計算前綴積,就會得出結果 19 double j=1.0; 20 for (int i = 0; i < length; j *= nums[i++]) 21 { 22 result[i] = j * (i == length - 1 ? 1 : result[i + 1]); 23 } 24 } 25 } 26 27 28 29 /* 30 * 題目描述:現有一個數組,里面包含了正數和負數,取其中若干個連續的數,要求這些數的和的絕對值最小 31 * 對數組A[1....N],做和運算S[1...N],其中S[1] = A[1]; S[2] = A[1]+A[2];...;S[N]=A[1]+A[2]+A[3]+...+A[N] 32 * 把所有和在數軸上表示出來,則最小值只會出現在相鄰兩個數之間,故需要排序,所以算法的時間復雜度主要取決於排序的時間復雜度 33 * 在這里使用快速排序算法 34 */