查找有序数组中某个数首次出现的位置
2013-12-11 22:47
316 查看
给定一个排序的数组,找出数组中某个元素第一次出现的位置。如果没有找到返回-1.
某次面试时遇到这个题。当时用循环形式的二分查找做的,解决得一般。面试官提示用递归形式的二分查找,没能做出来。
重新思考了下这个问题,发现find2这种递归形式的,的确清晰一些。
但实际上循环形式的二分查找,只需使用一个数组mids,记录每次的mid值,最后返回mids数组末尾元素也可以解决问题。
某次面试时遇到这个题。当时用循环形式的二分查找做的,解决得一般。面试官提示用递归形式的二分查找,没能做出来。
重新思考了下这个问题,发现find2这种递归形式的,的确清晰一些。
但实际上循环形式的二分查找,只需使用一个数组mids,记录每次的mid值,最后返回mids数组末尾元素也可以解决问题。
def find2(arr, low, high, n): if low > high: return -1 mid = low + (high - low) / 2 if arr[mid] == n: index = find2(arr, low, mid - 1, n) return mid if index == -1 else index else: if arr[mid] > n: return find2(arr, low, mid - 1, n) else: return find2(arr, mid + 1, high, n) def find(arr, n): low = 0 high = len(arr) - 1 mids = [] while low <= high: #print low, high mid = (low + high) / 2 if n < arr[mid]: high = mid - 1 elif n > arr[mid]: low = mid + 1 else: #return mid mids.append(mid) high = mid - 1 if len(mids) == 0: return -1 else: return mids[len(mids) - 1] if __name__ == '__main__': arr = [1, 1, 2, 2, 3, 5, 6, 9, 10, 10, 10, 10, 12, 12, 23, 24, 25] print find(arr, 1) print find(arr, 2) print find(arr, 10) print find(arr, 12) print find2(arr, 0, len(arr), 1) print find2(arr, 0, len(arr), 2) print find2(arr, 0, len(arr), 10) print find2(arr, 0, len(arr), 12)
相关文章推荐
- 查找有序数组中某个数首次出现的位置
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- 从有序数组中查找key第一次出现的位置以及出现的所有位置
- (核心算法)查找某个数在有序数组中(递增,含重复)第一次出现的下标
- 找到一个乱序数组排序后某一特定数值首次和末次出现的位置
- indexOf() 如何判断一个元素在指定数组中是否存在? 找出指定元素出现的所有位置? indexOf()方法 是正序查找,lastIndexOf()是倒叙查找
- 有序的数组中找到某一目标值首次出现的下标
- 数组问题 1.行列有序二维数组中查找2.在一组数成对出现的数中有两个数只出现一次3.在移位数组中查找一个数
- PHP strpos 查找字符串首次出现的位置
- 二分法查找数据首次出现位置
- C 查找字符在字符串首次出现的位置
- (二分查找思想)从有序递增旋转数组45679123 中找到数字6的位置
- js 查找某个值在数组中出现的位置
- /查找字符串str中首次出现c的位置
- 局部最小值位置、元素最左出现、循环有序数组最小值
- 在数组 arr 中,查找值与 item 相等的元素出现的所有位置
- c++在数组中查找元素并返回位置下标,统计某元素出现次数程序
- 插入元素到有序数组,二分搜索查找插入位置
- 【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置
- (二分查找思想)从有序递增旋转数组45679123 中找到数字6的位置