二分搜索——在有序数组中找到目标函数出来的最左端的位置
2017-06-28 21:37
351 查看
案例二:在数组中找到目标函数出来的最左端的位置
用上述数组来举例说明过程:目标函数为3,用res来记录最后找到目标元素的位置,初始为-1,表示目标函数不存在。
把目标函数3和最中间的元素4做比较,4比3大,则抛弃数组的右半部分(包括最中间的4),接下来找到数组剩下部分 1 2 3 3 3 3 4的中间值和3作比较,相等,则更新res的值,res=3;但是由于不确定是否是最左边的,所以再右半部分,接着在 1 2 3中找中间值和3做比较。由于2小于3,则说明目标函数在2的右边,把2右边的元素和3做比较,相等,则更新res=2,此时只有一个数了,所以res是最终的结果。
此题还有另一种方法:那就是将数组从左至右遍历和目标函数做比较,但是这种方法的复杂度为O(n)
二分搜索的复杂度为O(logn)
用上述数组来举例说明过程:目标函数为3,用res来记录最后找到目标元素的位置,初始为-1,表示目标函数不存在。
把目标函数3和最中间的元素4做比较,4比3大,则抛弃数组的右半部分(包括最中间的4),接下来找到数组剩下部分 1 2 3 3 3 3 4的中间值和3作比较,相等,则更新res的值,res=3;但是由于不确定是否是最左边的,所以再右半部分,接着在 1 2 3中找中间值和3做比较。由于2小于3,则说明目标函数在2的右边,把2右边的元素和3做比较,相等,则更新res=2,此时只有一个数了,所以res是最终的结果。
此题还有另一种方法:那就是将数组从左至右遍历和目标函数做比较,但是这种方法的复杂度为O(n)
二分搜索的复杂度为O(logn)
public class LeftLocationOfNum { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr1={1}; int[] arr2={1,3,2}; int[] arr3={1,2,3,3,3,3,4}; int[] arr4={1,2,2,3,3,3,4}; int[] arr5={1,2,2,2,3,3,4}; System.out.println(getLeftIndex(arr1,3)); System.out.println(getLeftIndex(arr2,3)); System.out.println(getLeftIndex(arr3,3)); System.out.println(getLeftIndex(arr4,3)); System.out.println(getLeftIndex(arr5,3)); } public static int getLeftIndex(int[] arr, int k){ if(arr==null||arr.length==0) return -1; int res=-1; //用来记录最后找到目标元素的位置 int left=0; int right=arr.length-1; int mid=0; int len=arr.length; while(len>0){ mid=left + (right - left) / 2; if(k<=arr[mid]){ res=mid; right=mid-1; } else if(k>arr[mid]){ left=mid+1; } len=right-left+1; //更新数组的长度 } return res; } }
相关文章推荐
- (二分查找思想)从有序递增旋转数组45679123 中找到数字6的位置
- 插入元素到有序数组,二分搜索查找插入位置
- 二分搜索——返回有序数组中数组值等于下标值的最左位置
- (二分查找思想)从有序递增旋转数组45679123 中找到数字6的位置
- 二分搜索典型应用(一)从有序数组中查找某个值
- 利用二分收索查找该数在该数组所在的位置,前提是要保证改数组是有序的
- 编程珠矶 习题 4.6 利用二分搜索找到一个数在顺序数组里面的下限和上限
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- 折半法(二分)搜索有序数列元素下标及数组传参问题
- 二分查找:在有序数组中搜索大于等于x的数的最小下标
- wukong引擎源码分析之搜索——docid有序的数组里二分归并求交集,如果用跳表的话,在插入索引时会更快
- 【算法】如何在有序的数组中找到一个数的位置(递归)
- leetcode之数组类之数组的旋转与分治类-----OJ 189/33/81/153/154 数组旋转 旋转数组搜索 88 有序数组合并 4 两个有序数组寻找第K个元素/中位数 35 寻找插入位置
- 折半查找,也称二分查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。
- N个有序整数数列已放在一维数组中,利用二分查找法查找整数m在数组中的位置,若找到,则输出其下标值;反之,则输出 “Not be found”
- 面试杂题(三)有序数组中连续k的个数(含二分搜索的递归非递归写法)
- 在两个有序的数组中找第N个数,二分查找 O(lgm+lgn)级
- 有序数组的二分查找
- 有序数组中的二分查找
- 二分搜索应用(旋转数组)——C语言