从别处看到的一道算法附加题
题目:已知一个数组a[N],构造一个数组b[N],构造规则:b[i]=a[0]*a[1]*a[2]...a[N]/a[i];
要求:
1、不可以使用除法;
2、时间复杂度为O(n),空间复杂度为S(0);
3、除遍历使用的变量外,不可以使用其它变量;
自己的解法虽然不合题意,终究是自己想的,但是极力只用1个.可以使用遍历变量我就无耻的把他当作遍历变量吧,空间复杂度就无法满足了使用递归的话.......
思路很简单:递归到最后一个元素过程中边计算之前的数字乘法积,然后记录后面元素乘积和.
//r1 :用来记录index后的元素乘积
//r2 :index之前的元素的乘积
//index:当前所处的元素的索引号
static void Fun(int[] a, int[] b, int index, ref int r1, int r2)
个人觉得解法比较精炼,所以贴出来,给自己做个记录.
1 class Program
2 {
3 static void Fun(int[] a, int[] b, int index, ref int r1, int r2)
4 {
5 if (index == b.Length - 1)
6 {
7 b[index] = r2;
8 r1 = a[index];
9 return ;
10 }
11 r1 = 1;
12 Fun(a, b, index + 1,ref r1, r2 * a[index]);
13 b[index] = r2 * r1;
14 r1 = a[index] * r1;
15 }
16
17
18
19 static void Main(string[] args)
20 {
21 int[] a = new int[11];
22 int[] b = new int[a.Length];
23 int total = 1;
24 for (int i = 0; i < a.Length; i++)
25 {
26 a[i] = i + 1;
27 total *= (i + 1);
28 }
29 //Console.WriteLine(total);
30 int r1 = 1;
31 int r2 = 1;
32 Fun(a, b, 0, ref r1, r2);
33 for (int i = 0; i < b.Length; i++)
34 {
35 Console.WriteLine(b[i] + "=" + total / a[i]);
36 }
37 Console.ReadLine();
38 }
39
40
41 }
2 {
3 static void Fun(int[] a, int[] b, int index, ref int r1, int r2)
4 {
5 if (index == b.Length - 1)
6 {
7 b[index] = r2;
8 r1 = a[index];
9 return ;
10 }
11 r1 = 1;
12 Fun(a, b, index + 1,ref r1, r2 * a[index]);
13 b[index] = r2 * r1;
14 r1 = a[index] * r1;
15 }
16
17
18
19 static void Main(string[] args)
20 {
21 int[] a = new int[11];
22 int[] b = new int[a.Length];
23 int total = 1;
24 for (int i = 0; i < a.Length; i++)
25 {
26 a[i] = i + 1;
27 total *= (i + 1);
28 }
29 //Console.WriteLine(total);
30 int r1 = 1;
31 int r2 = 1;
32 Fun(a, b, 0, ref r1, r2);
33 for (int i = 0; i < b.Length; i++)
34 {
35 Console.WriteLine(b[i] + "=" + total / a[i]);
36 }
37 Console.ReadLine();
38 }
39
40
41 }