2014-05-01 00:45

题目链接

原题:

input [2,3,1,4] 
output [12,8,24,6] 

Multiply all fields except it's own position. 

Restrictions: 
1. no use of division 
2. complexity in O(n)

题目:给定一个整数数组,将个元素变为其他元素的乘积,例如[2, 3, 1, 4]变为[12, 8, 24, 6]。限制不准用除法,而且时间复杂度为线性级别。

解法:用一个额外的数组能够完成O(n)时间的算法。由于每个元素在变化之后,应该等于左边和右边的累计乘积,所以两边的累计乘积必须同时能够知道。一边可以用O(1)空间扫描得到,另一边只能用O(n)空间进行记录。时间空间复杂度均为O(n),请看代码。

代码:

 1 // http://www.careercup.com/question?id=5179916190482432
 2 #include <cstdio>
 3 #include <vector>
 4 using namespace std;
 5 
 6 void multiplyArray(vector<int> &v)
 7 {
 8     vector<int> vp;
 9     int p;
10     int i;
11     int n = (int)v.size();
12     
13     vp.resize(n);
14     p = 1;
15     for (i = 0; i <= n - 1; ++i) {
16         vp[i] = p;
17         p *= v[i];
18     }
19     
20     p = 1;
21     for (i = n - 1; i >= 0; --i) {
22         vp[i] = p * vp[i];
23         p *= v[i];
24     }
25 
26     for (i = 0; i < n; ++i) {
27         v[i] = vp[i];
28     }
29     
30     vp.clear();
31 }
32 
33 int main()
34 {
35     int i, n;
36     vector<int> v;
37     
38     while (scanf("%d", &n) == 1 && n >= 0) {
39         v.resize(n);
40         for (i = 0; i < n; ++i) {
41             scanf("%d", &v[i]);
42         }
43         multiplyArray(v);
44         for (i = 0; i < n; ++i) {
45             printf((i ? " %d" : "%d"), v[i]);
46         }
47         putchar('\n');
48     }
49     
50     return 0;
51 }

 

 posted on 2014-05-01 01:00  zhuli19901106  阅读(176)  评论(0编辑  收藏  举报