开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1505|回复: 3
收起左侧

[C#图文教程] 一道算法题的一种O(n)解法

[复制链接]

结帖率:100% (6/6)
发表于 2013-2-22 22:10:05 | 显示全部楼层 |阅读模式   广东省东莞市
很早就有去做做的想法,可是一直没动手

今天花了点时间搞搞

结果如下:

核心部分





代码
1  public List<Result> GetResults(int[] arr)
2         {
3             //输入有效性检测
4             if (arr.Length==0)
5                 throw new NotEnoughInputException();
6
7             List<Result> rlist = new List<Result>();
8            
9             //实际运算
10            
11             //初始化起始位置,将第一点当作后续结果的起点
12             Position startP = new Position(Position.EmptyPosition, arr[0]);
13
14             //当前点就当作是最大结果值
15             Result curResult = new Result(Position.EmptyPosition, startP);
16
17             //向结果列表添加内容
18             rlist.Add(curResult);
19
20             //有一个以上的数据
21             if (arr.Length > 1)
22             {
23                 Position curP,nextP;
24                 curP=startP;
25                 Result temp;//保存到目前点为止的结果数据
26                 //从第二个点开始逐个判断
27                 for (int i = 1; i < arr.Length; i++)
28                 {
29                     //构造对象
30                     nextP = new Position(curP,arr[i]);
31                     temp = new Result(startP, nextP);
32
33                     //判断当前的和是否大于现有结果列表中的数据
34                     if (temp.RelativeElevation > rlist[0].RelativeElevation)
35                     {//如果大于则清除结果列表,添加当前结果
36                         rlist.Clear();
37                         rlist.Add(temp);
38                     }
39                     //判断当前的和是否等于现有结果列表中的数据
40                     else if (temp.RelativeElevation == rlist[0].RelativeElevation)
41                     {
42                         rlist.Add(temp);
43                     }
44                     //判断当前是否是一个新的低点
45                     else if(nextP.EndElevation<=startP.StartElevation)
46                     {
47                         startP = nextP;
48                     }
49                     curP = nextP;
50                 }
51             }           
52
53             return rlist;
54         }




代码还有进一步优化的余地

主体思想就是模拟一个不断爬山的人,爬完一遍后要回答那座山和山谷的相对落差最大

完整代码在此

主要多用了些类,呵呵。

局部代码有些不好理解,呵呵。比如里面关于全负数的处理。

结帖率:33% (1/3)
发表于 2013-7-23 14:43:16 | 显示全部楼层   湖南省长沙市
不过O(n)的其实也不错了,很多都是n的阶乘或者n^2.
回复 支持 反对

使用道具 举报

结帖率:33% (1/3)
发表于 2013-7-23 14:42:42 | 显示全部楼层   湖南省长沙市
这个算法效率不高。。就这样
回复 支持 反对

使用道具 举报

结帖率:100% (11/11)
发表于 2013-2-22 22:10:46 | 显示全部楼层   河北省衡水市
真是 女生真霸道  我们都是发两贴 每次你都发三贴
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表