整型题目优化方法之打表规律

题目描述

一个人去商店买苹果,苹果店老板是2B,只提供6个一袋和8个一袋两种包装,并且,如果有袋子无法整装下,就不卖。现在这个人想买N个苹果,请求出能装下N个苹果的最小袋子数量,如果袋子无法整装下,就返回-1

思路分析

此题典型的贪心策略解决,既然要求袋子最少,那么,就应该优先使用能装8个的袋子,先使用最多的8个的袋子,剩下的交给6个袋子装,如果6个无法正好装下,则这个策略失败,然后8个的袋子减少一个,依次尝试,如果所有策略都尝试完,还没找到,则返回-1。
注意,此题根据数据分析,还可以有个小优化,那就是,如果N为奇数,则肯定无法正好装下,则直接返回-1

代码

    public static int f1(int n){
    	//奇数直接返回
        if((n&1)!=0){
            return -1;
        }
        int eight=n/8;
        while (eight!=-1){
            if((n-8*eight)%6==0){
                return eight+(n-8*eight)/6;
            }
            eight--;
        }
        return -1;
    }

整型题目优化之打表规律

很显然,上述的贪心算法并不是最优解,这种输入输出都是整型的题目,有一种和题目没有任何关系的优化方案,那就是打表规律。
打表规律:
其实这种优化巨傻逼,就是在你用一般的方法将题目解决之后,然后,分析输出的结果,找规律,然后再写出一个和根据规律的解法,其实此时的优化就和原始题目没有任何关系了。
观察此题的输出结果,n为前100的结果如下:
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
100:13

可以发现,从18开始,每8个是一组,偶数每多一组增加1,奇数都是-1,然后根据这个规律写代码,和原题无关。

代码

    public static int f2(int n){
        if((n&1)!=0){
            return -1;
        }
        if(n<18){
            return n==0? 0:(n==6||n==8)? 1: (n==12||n==14||n==16)? 2:-1;
        }
        return (n-18)/8+3;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值