一个有n个整数的递增有序数组。对它进行向左或向右循环移动若干次后,要求给出一个代码实现,尽可能快地从这个数组中寻找指定值所在的位置
2015-03-27 15:21
393 查看
题目:一个有n个整数的递增有序数组。对它进行向左或向右循环移动若干次后,要求给出一个代码实现,尽可能快地从这个数组中寻找指定值所在的位置,不在数组中返回-1.
例如:输入:5 (然后在数组(15 16 19 20 25 1 3 4 5 7 10 14)中寻找5 的位置)
输出: 8 (为5 在数组的下标)
对于给定的这道题很多人考虑效率都会用折半查找,这里说一下我的思路:
1.设定待查数字m
2.将待查数字m和数组首位数字arr[0]进行比较
2.1.如果m>arr[0],则m在从左至右升序序列中
2.2.如果m<arr[0].则m在从右至左降序序列中
例如:输入:5 (然后在数组(15 16 19 20 25 1 3 4 5 7 10 14)中寻找5 的位置)
输出: 8 (为5 在数组的下标)
对于给定的这道题很多人考虑效率都会用折半查找,这里说一下我的思路:
1.设定待查数字m
2.将待查数字m和数组首位数字arr[0]进行比较
2.1.如果m>arr[0],则m在从左至右升序序列中
2.2.如果m<arr[0].则m在从右至左降序序列中
public int Serch(int arr, int m){ int index = 0;//用于记录返回目标数的位置 if(m>=arr[0]){ for(int i=0;i<n;i++){ if(m==arr[i]) index = i; } }else{ for(int j=n-1;j>0;j--){ if(m==arr[j]) index = j; } return index; }上述实现如果出现arr[0]>arr[n-1],则表明整个序列有序,可以直接二分查找,当然我也有想过完全用二分查找,但是必须找到无序处的两个分界值,这样就会增加额外时间复杂度,希望有更好的解法交流交流
相关文章推荐
- 有一个数组a[1000]存放0--1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。
- 有一个数组a[1000]存放0--1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。
- 整数型的有序递增数组循环右移x位后,查找指定整数 算法
- 黑马程序员之C#编程基础学习笔记:将一个整数数组的每一个元素进行如下的处理:如果元素是正数则将这个位置的元素的值加1,如果元素是负数则将这个位置的元素减1。
- 对一个有序数组进行折半查找和把一个整数插入这个数组序列,使其仍旧有序
- :输入10个整数,保存在一个数组中,在数组中查找某个数,给出是否找到的信息。如果找到了,要求输出该数在数组中所处的位置;如果找不到,输出“没有找到!
- 现在有一个有序的数组,要求用户输入一个整数放到数组中还保证这个数组是有序的。
- 【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置
- (2)int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
- 把一个数组向右循环移动k位要求时间复杂度为O(n)
- (旋转数组问题)给定一个整数类型的循环有序数组,求循环数组的特定值,使用二分查找法(JAVA实现)
- 已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。 给定一个int数组A,同时给定
- 写一个算法,使对象可以像数组一样进行foreach循环,要求属性必须是私有的(Interator模式的PHP5实现,写一类实现Interator接口)
- 有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- 对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间。原数组为:A,B,C,D,E, 现给定新的位置为3, 0, 1, 4, 2那么排序为D,A,B,E,C
- 有一堆扑克牌,其中某张牌的张数超过了扑克牌总数的一半,请找到这张牌。写出算法思路、代码实现和算法的时间复杂度,要求算法尽可能高效。假设给定一个扑克牌的数组poker和它的大小n,请返回所求的扑克牌。
- 输入n个整数,编写函数实现以下操作,要求用指针实现: (1) 对n个数进行排序; (2) 将从指定位置的m个数逆序存放,例如:原序列为2,4,6,8,10,12,14,16,18,20,若要求把
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。