经典算法(15) “一步千里”之数组找数

首先看看题目要求(题目来源:http://weibo.com/lirenchen,特此鸣谢):

有这样一个数组A, 大小为n,相邻元素差的绝对值都是1。如:A={4,5,6,5,6,7,8,9,10,9}。现在,给定A和目标整数t,请找到t 在A中的位置。除了依次遍历,还有更好的方法么?

这道题目的解法非常有趣。

数组第一个数 为array[0], 要找的数为y,设t = abs(y - array[0])。由于每个相邻的数字之差的绝对值为1。故第t个位 置之前的数肯定都比y小。因此直接定位到array[t],重新计算t,t = abs(y – array[t]),再重复上述步 骤即可。这种算法主要利用了当前位置的数与查找数的差来实现跨越式搜索。算法效率要比遍历数组的算法 要高一些,并且易于实现。完整的代码如下:

// 【白话经典算法系列之十五】“一步千里”之数组找数
//  by MoreWindows( http://blog.csdn.net/MoreWindows )
//  欢迎关注http://weibo.com/morewindows
#include <stdio.h>
#include <math.h>
void PrintfArray(int a[], int n)
{
  for (int i = 0; i < n; i++)
      printf("%d ", a[i]);
  putchar('\n');
}
int FindNumberInArray(int arr[], int n , int find_number)
{
  int next_arrive_index = abs(find_number - arr[0]);
  while (next_arrive_index < n)
  {
    if (arr[next_arrive_index] == find_number)
      return next_arrive_index;
    next_arrive_index += abs(find_number - arr[next_arrive_index]);
  }
  return -1;
}
int main()
{
  printf("    【白话经典算法系列之十五】“一步千里”之数组找数\n");
  printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n");
  printf(" -- http://blog.csdn.net/morewindows/article/details/10645269 -- \n\n");  

  const int MAXN = 10;
  int arr[MAXN] = {4,5,6,5,6,7,8,9,10,9};
  PrintfArray(arr, MAXN);
  for (int i = 0; i < MAXN; i++)
    printf("查找%d   \t下标为%d\n", arr[i], FindNumberInArray(arr, MAXN, arr[i]));  

  printf("查找%d   \t下标为%d\n", -1, FindNumberInArray(arr, MAXN, -1));
  printf("查找%d   \t下标为%d\n", 0, FindNumberInArray(arr, MAXN, 0));
  printf("查找%d   \t下标为%d\n", 100, FindNumberInArray(arr, MAXN, 100));
  return 0;
}

运行结果如下图所示:

本文地址:http://blog.csdn.net/morewindows/article/details/10645269

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索算法
, 数组
, int
, printf
, 数组大小为2n+1
, arr
, 下标
, 查找算法 .NET
经典算法
数组排序算法、翔田千里最经典、kmp算法next数组、后缀数组 倍增算法、美上千里最经典作品,以便于您获取更多的相关知识。

时间: 2024-11-03 22:30:24

经典算法(15) “一步千里”之数组找数的相关文章

菜鸟网赚成长记:积一时之跬步 臻千里之遥程

中介交易 SEO诊断 淘宝客 云主机 技术大厅 导读:随着互联网时代的兴起,一根网线.一台电脑,已经可以帮助众多有梦想的年轻人追梦,网络赚钱已经不再是遥不可及,网赚成了众多追梦者体现自己价值,增加自己财富的手段之一.网络世界虚幻是否让你曾为之动摇,是否让你忘记自我的追逐奋斗,网赚的你是否知道:"不积跬步,无以至千里;不积小流,无以成江河"的道理. 序言: A5论坛又一期的网赚征文活动,对于菜鸟级别的网赚新手来说,本不应该拿着点小小的成就来炫耀,但是即使是菜鸟也有自己的梦想,也有自己网赚

F5公司:积跬步至千里

2015年12月10日,应用交付领导厂商F5公司一年一度的核心媒体沟通会在北京召开.会上,F5中国区总经理张毅强先生.F5大中华区技术总监张振伦先生与F5中国区区域客户部技术经理陈亮先生分别从各自角度进行了讲解,与到场媒体朋友分享了F5公司在过去一年中的成长,以及对2016年应用交付行业发展趋势的展望. 张毅强先生在会上首先透露:"在经济形势严峻.企业用户纷纷收紧预算的2015年,F5中国仍保持了两位数字的业绩涨幅.这样的表现与F5的企业文化是分不开的.F5始终相信'不积跬步,无以至千里'的道理

跬步至千里:医改建设把好成本关

--Ballarat Health Services 通过惠普文印管理大量削减打印成本 随着国务院原则通过新医改方案,医疗改革再次成为公众关注的焦点.打造数字医院作为提升诊疗效率的战略举措,受到空前重视.近年来国内医院信息化实践表明,一度未引起足够重视的医疗档案纪录打印和管理,正成为不可忽视的成本"冰山".如何采用更好的解决方案来化解不断攀升的文印成本,是医院领导直面的重要课题. Ballarat Health Services(BHS)是澳大利亚格兰屏地区最大的地方医院.在信息化建设

汪洋千里,始于小流跬步——广州创硕数码有限公司

也许当初连创硕的创始人严总也没有想到,创硕会有今天的成就.从一个30平方的简陋办公室到超过1800平米的办公空间,从10万元的业绩做到3000万,从一家名不见经传的小公司发展成为在全国有多家分公司和加盟商的企业,一切的一切仿佛都像是一个传奇,一场绮梦.但是这真真切切的发生在了创硕的身上,是偶然,也是必然. 公司创业初期,电脑是二手的,软件是自己开发的,30平米的办公室白天接待客户,晚上就是严总的卧室.上天总是会回报努力耕耘的人,创硕公司终于开发出了第一台全国产化的大头贴机器.当2001年大头贴风

数据挖掘十大经典算法(详解)

数据挖掘十大经典算法  一. C4.5  C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3 算法.   C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进:  1) 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足:  2) 在树构造过程中进行剪枝:  3) 能够完成对连续属性的离散化处理:  4) 能够对不完整数据进行处理.  C4.5算法有如下优点:产生的分类规则易于理解,准确率较高.其缺点是:在构造树的过程中,需要对数据

PHP经典算法集锦【经典收藏】_php技巧

本文实例总结了PHP经典算法.分享给大家供大家参考,具体如下: 1.首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半. 思路:多少行for一次,然后在里面空格和星号for一次. <?php for($i=0;$i<=3;$i++){ echo str_repeat(" ",3-$i); echo str_repeat("*",$i*2+1); echo '<br/>'; } 2.冒泡排序,C里基础算法,从小到大对一组数

经典算法题每日演练——第二十五题 块状链表

原文:经典算法题每日演练--第二十五题 块状链表 在数据结构的世界里,我们会认识各种各样的数据结构,每一种数据结构都能解决相应领域的问题,每一种数据结构都像 是降龙十八掌中的某一掌,掌掌毙命... 当然每个数据结构,有他的优点,必然就有它的缺点,那么如何创造一种数据结构 来将某两种数据结构进行扬长避短,那就非常完美了.这样的数据结构也有很多,比如:双端队列,还有就是今天讲的 块状链表,    我们都知道 数组 具有 O(1)的查询时间,O(N)的删除,O(N)的插入...            

经典算法:基数排序的小例子_实用技巧

1.概述 基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较.由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数.基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献. 原理:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.这样从最低位排序一直到最高位排序完成以后,

经典算法题每日演练——第七题 KMP算法

原文:经典算法题每日演练--第七题 KMP算法       在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树是变态级的,那么kmp算法比红黑树还要变态,很抱歉,每次打kmp的时候,输 入法总是提示"看毛片"三个字,嘿嘿,就叫"看毛片算法"吧. 一:BF算法      如果让你写字符串的模式匹配,你可能会很快的写出朴素的bf算法,至少问题是解决了,我想大家很清楚的知