今天看到了两道有关于前缀和应用的的算法题,解法挺巧妙的,分享给大家。
在这里直接放上我的代码,题目和注释在代码解释的都非常清楚。
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 */