給定一個(gè)長(zhǎng)度為N的整數(shù)數(shù)組,只允許用乘法,計(jì)算任意(N-1)個(gè)數(shù)的組合乘積中最大的一組,并
寫出算法的時(shí)間復(fù)雜度。
最容易想到的就是通過一次遍歷把所有(N-1)個(gè)數(shù)的組合找出來,分別計(jì)算他們的乘積,并比較
大小。由于總共有N個(gè)(N-1)個(gè)數(shù)的組合,總的時(shí)間復(fù)雜度為O(N的2次方),顯然這不是最好的解決
辦法。
且看下面的實(shí)現(xiàn)方法,當(dāng)然也是比較簡(jiǎn)單的,畢竟沒太多時(shí)間思考,他的時(shí)間復(fù)雜度只有O(N)。
當(dāng)然肯定有其他的方式解決這個(gè)問題,blog友如果有好的方式可以貼出來分享。謝謝!
寫出算法的時(shí)間復(fù)雜度。
最容易想到的就是通過一次遍歷把所有(N-1)個(gè)數(shù)的組合找出來,分別計(jì)算他們的乘積,并比較
大小。由于總共有N個(gè)(N-1)個(gè)數(shù)的組合,總的時(shí)間復(fù)雜度為O(N的2次方),顯然這不是最好的解決
辦法。
且看下面的實(shí)現(xiàn)方法,當(dāng)然也是比較簡(jiǎn)單的,畢竟沒太多時(shí)間思考,他的時(shí)間復(fù)雜度只有O(N)。
當(dāng)然肯定有其他的方式解決這個(gè)問題,blog友如果有好的方式可以貼出來分享。謝謝!
1
package org.blogjava.arithmetic;
2
3
import java.util.ArrayList;
4
5
/**
6
* @author Jack.Wang
7
* @see http://jack2007.blogjava.net/
8
*/
9
public class Array<E> extends ArrayList<E> {
10
private static final long serialVersionUID = 7799621696481440826L;
11
12
private static long maxOfSubArray(Array arr) {
13
// 最大值
14
long max = 0;
15
int size = arr.size();
16
// s[i]表示前i個(gè)元素的乘積,可知s[i]=s[i-1]*arr.get(i-1) 其中(1<=i<=N)
17
long[] s = new long[size + 1];
18
s[0] = 1;
19
// t[i]表示i后面元素的乘積,可知t[i]=t[i+1]*arr.get(i) 其中(1<=i<=N)
20
long[] t = new long[size + 1];
21
t[size] = 1;
22
// 設(shè)p[i]為除第i個(gè)元素之外的其他元素之積,即:p[i]=s[i-1]*t[i+1];
23
long[] p = new long[size + 1];
24
25
// 求出 s數(shù)組
26
for (int i = 1; i <= size; i++) {
27
s[i] = s[i - 1] * ((Integer) arr.get(i - 1));
28
}
29
// 求出t數(shù)組
30
for (int i = size - 1; i >= 0; i--) {
31
t[i] = t[i + 1] * ((Integer) arr.get(i));
32
}
33
// 計(jì)算 p數(shù)組
34
for (int i = 1; i <= size; i++) {
35
p[i] = s[i - 1] * t[i];
36
if (p[i] > max) {
37
max = p[i];
38
}
39
}
40
return max;
41
}
42
43
public static void main(String[] args) {
44
Array<Integer> array = new Array<Integer>();
45
array.add(1);
46
array.add(4);
47
array.add(6);
48
array.add(10);
49
array.add(12);
50
array.add(40);
51
// 上面的數(shù)字很簡(jiǎn)單,口算也知道N-1個(gè)最大乘積為115200
52
// 算法結(jié)果:
53
System.out.println(" 算法結(jié)果:" + maxOfSubArray(array));
54
}
55
56
}
57

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

本博客為學(xué)習(xí)交流用,凡未注明引用的均為本人作品,轉(zhuǎn)載請(qǐng)注明出處,如有版權(quán)問題請(qǐng)及時(shí)通知。由于博客時(shí)間倉促,錯(cuò)誤之處敬請(qǐng)諒解,有任何意見可給我留言,愿共同學(xué)習(xí)進(jìn)步。