您的位置:首页 > 其它

从别处看到的一道算法附加题

2012-05-11 17:58 309 查看
题目:已知一个数组a
,构造一个数组b
,构造规则:b[i]=a[0]*a[1]*a[2]...a
/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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: