免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4453 | 回复: 14
打印 上一主题 下一主题

[算法] ---------------------- [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-15 20:50 |只看该作者 |倒序浏览
本帖最后由 sesame0816 于 2014-09-27 16:30 编辑

----------------------

论坛徽章:
0
2 [报告]
发表于 2008-10-15 21:13 |只看该作者
不就是找出最大值和最小值么,当然是O(n)咯

论坛徽章:
0
3 [报告]
发表于 2008-10-15 21:29 |只看该作者

回复 #2 deadlylight 的帖子

是要找出相邻两数的最大差值,不是两数的最大差值吧。。。。。

论坛徽章:
0
4 [报告]
发表于 2008-10-15 21:32 |只看该作者
原帖由 xiyoubbs 于 2008-10-15 21:29 发表
是要找出相邻两数的最大差值,不是两数的最大差值吧。。。。。


对:wink:

论坛徽章:
0
5 [报告]
发表于 2008-10-15 22:35 |只看该作者
关注中...

论坛徽章:
0
6 [报告]
发表于 2008-10-16 09:00 |只看该作者
1.遍历一遍数组,找出最大值和最小值,时间复杂度O(1.5n)
2.将最大值和最小值之间的区间等分成n-1个小区间,每个区间大小 delt = (max-min)/(n-1),第i个区间[min+delt*(i-1),min+delt*i)
(根据抽屉原理,排序后相邻数的差大于等于delt,所以如果2个数 在同一个delt内,就可以不考虑)
3.扫描数组,将每个数放到相应的区间中(这里有点桶排序的思想)
4.找出每个区间的最大值和最小值,如果该区间为空,则标记为空
将每个区间的最大值和他相邻右边区间的最小值作差(如果右边空间为空,则一直找到一个非空的区间)得到t个差值 ,t <=n,求出t个差值最大值即可


第4步时间复杂度为O(n)
因为设每个区间元素个数为mi
则m1+m2+...mn-1 = n-2;
找出每个区间最大最小值
为 1.5(m1+m2+...mn-1) = 1.5n所以时间复杂度O(n)

[[i] 本帖最后由 yuyongyu 于 2008-10-16 15:00 编辑 [/i]]

论坛徽章:
0
7 [报告]
发表于 2008-10-16 09:14 |只看该作者
关注。。。

LS的好复杂

论坛徽章:
0
8 [报告]
发表于 2008-10-16 10:17 |只看该作者
原帖由 yuyongyu 于 2008-10-16 09:00 发表
遍历一遍数组,找出最大值和最小值,时间复杂度O(1.5n)
将最大值和最小值之间的区间分成n-1个小区间,每个区间大小 delt = (max-min)/(n-1)
根据抽屉原理,排序后相邻数的差大于等于delt,所以如果2个数 在同 ...


请问这n-1个区间是按升序或降序排列吗? 如果是,请问如何再o(n)时间内实现?如果不是,又如何说明 “区间的最大值和他相邻右边区间的最小值作差” 就是解(可能解)呢?

论坛徽章:
0
9 [报告]
发表于 2008-10-16 10:35 |只看该作者
就是有点桶排序的思想
设这个数组最大值为max,最小值min
则第i个区间为[min+(i-1)*delt,min+i*delt),即把区间等分成n-1个小区间

论坛徽章:
0
10 [报告]
发表于 2008-10-16 12:47 |只看该作者
int a[10] = {5,1,7,3,4,18,15,24,20,10};
        int min,max,big,small,result,tempResult1,tempResult2;

        small = min = min(a[0],a[1]);
        big = max = max(a[0],a[1]);
        result = tempResult1 = tempResult2 = big - small;

        cout << "result:" << result << " big:" << big << " small:" << small << endl;
        cout << " tempResult1:" << tempResult1 << " tempResult2:" << tempResult2
                << " max:" << max << " min:" << min << endl;
        cout << "初始化完毕" << endl;
        for (int i=2;i<10;i++) {
                if (a < big && a > small) {
                        tempResult1 = big - a;
                        tempResult2 = a - small;
                        if (tempResult1 > tempResult2) {
                                small = a;
                                result = tempResult1;
                        } else {
                                big = a;
                                result = tempResult2;
                        }
                } else if (a > max) {
                        tempResult1 = a - max;
                        if (tempResult1 > result) {
                                big = a;
                                small = max;
                                result = tempResult1;
                                //cout << "changing2" << endl;
                        }
                } else if (a < small) {
                        tempResult2 = small - a;
                        if (tempResult2 > result) {
                                big = small;
                                small = a;
                                result = tempResult2;
                        }
                }
                min = min(min, a);
                max = max(max, a);
        }
        cout << "result:" << result << " big:" << big << " small:" << small << endl;
        cout << " tempResult1:" << tempResult1 << " tempResult2:" << tempResult2
                 << " max:" << max << " min:" << min << endl;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP