去哪儿笔试题——排序数组循环移位后查找
2015-03-21 21:24
218 查看
排序数组循环移位后查找
题目:
请完成以下算法,给定一个循环有序的数组,在这个数组中找到指定元素,找到的话返回下标,没有找到返回-1。
该数据的特点是它是一个单调递增的数组向右循环移位形成的。
举例说明,原数组是[4, 8, 13, 20, 23, 34, 41, 52]经过向右循环移位后形成的数组可能是[23, 34, 41, 52, 4, 8, 13, 20],也可能是[4, 8, 13, 20, 23, 34, 41, 52]
第一行输入数组的长度
第二行是数组的元素,用空格隔开
第三行是想要查找的元素
样例输入
7
1 3 5 6 8 10 20
19
样例输出
-1
思路:1>排序(时间复杂度最低为n*logn,不考虑)
2>直接顺序查找(时间复杂度为n)
3>优化的顺序查找,一遍扫描,两头均比较(时间复杂度n)
代码:
int my_lookup(int *list,int len, int target){ int i = 0; for( i = 0 ; i <= (len/2 + 1) ; i++){ if(list[i] == target){ return i; } else if(list[len - i - 1] == target){ return len - i - 1; } } return -1; }以上代码已经提交并AC了。
4>二分查找,将数组分为两段递增数组,然后使用二分查找。(时间复杂度logn)
代码:
int my_lookup(int *list, int len, int target){ int left = 0; int right = len - 1; int mid = (left + right) / 2; while(left <= right){ if(list[mid] == target) return mid; if(list[left] == target) return left; if(list[right] == target) return right; if(list[left] <= list[mid]){ if(list[left] < target && target < list[mid]){ left++; right = mid - 1; }else{ left = mid + 1; right--; } }else{ if(list[mid] < target && target < list[right]){ left = mid + 1; right--; }else{ left++; right = mid - 1; } } mid = (left + right) / 2; } return -1; }
相关文章推荐
- 小米笔试:循环排序数组二分查找
- 排序数组循环移位后查找问题
- 笔试:查找未排序数组的前k个最小值
- 使用while循环和折半法查找一个整数是否在一个排序的int类型数组中
- 【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置
- 笔试之循环递增数组查找
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- lintcode寻找旋转排序数组中的最小值/循环有序数组的查找
- 使用java从一个整数数组中查找第二大的数,仅用一次循环,不使用java自带的排序
- 例题3-8 使用whle循环和折半法查找一个整数是否在一个排序的int类型数组中
- 数组循环移位
- 【二分查找】在排序数组中,找出给定数字的出现次数 以及二分其他应用
- 华为机试——数组循环移位
- 【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数
- UVALive 6609 Minimal Subarray Length (查找+构建排序数组)
- 编程之美2.17数组循环移位Java版
- 黑马程序员_JavaSE基础06 之 数组的操作 求最值 排序 折半查找
- 程序员面试题精选100题(10)-在排序数组中查找和为给定值的两个数字
- 二分查找--数字在排序数组中出现的次数
- 编程之美2.17——数组循环移位