代码改变世界

两道关于前缀和的算法题

2015-06-22 21:56  F_Code  阅读(2850)  评论(0编辑  收藏  举报

今天看到了两道有关于前缀和应用的的算法题,解法挺巧妙的,分享给大家。

在这里直接放上我的代码,题目和注释在代码解释的都非常清楚。

 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      */