做题思路:暴力深搜找规律
我们可以用暴力递归的方法打印出 1~100 的结果,然后通过递归结果总结出规律,从而优化时空复杂度
暴力递归:
static int dfs(int n){
if(n == 6 || n == 8){
return 1;
}
if(n % 2 != 0 || n < 8){
return -1;
}
int a = dfs(n-6);
int b = dfs(n-8);
int min = Integer.MAX_VALUE;
if(a != -1){
min = Math.min(min, a);
}
if(b != -1){
min = Math.min(min, b);
}
int ans = min == Integer.MAX_VALUE ? -1 : min+1;
return ans;
}
枚举1~100,调用 dfs 可以得到以下结果:
1 -1
2 -1
3 -1
4 -1
5 -1
6 1
7 -1
8 1
9 -1
10 -1
11 -1
12 2
13 -1
14 2
15 -1
16 2
17 -1
18 3
19 -1
20 3
21 -1
22 3
23 -1
24 3
25 -1
26 4
27 -1
28 4
29 -1
30 4
31 -1
32 4
33 -1
34 5
35 -1
36 5
37 -1
38 5
39 -1
40 5
41 -1
42 6
43 -1
44 6
45 -1
46 6
47 -1
48 6
49 -1
50 7
51 -1
52 7
53 -1
54 7
55 -1
56 7
57 -1
58 8
59 -1
60 8
61 -1
62 8
63 -1
64 8
65 -1
66 9
67 -1
68 9
69 -1
70 9
71 -1
72 9
73 -1
74 10
75 -1
76 10
77 -1
78 10
79 -1
80 10
81 -1
82 11
83 -1
84 11
85 -1
86 11
87 -1
88 11
89 -1
90 12
91 -1
92 12
93 -1
94 12
95 -1
96 12
97 -1
98 13
99 -1
可以容易的看到从 18 开始,后面的数每 8 个都可以分为一组,根据此总结出优化的做法:
//根据得到的规律退出公式
static int good(int n){
if(n % 2 != 0){
return -1;
}
if(n < 18){
if(n == 6 || n == 8){
return 1;
}else if(n == 12 || n == 14 || n == 16){
return 2;
}
}else{
return (n-18)/8 + 3;
}
return -1;
}