二分查找

来源:互联网 发布:淘宝倒卖游戏币犯法吗 编辑:程序博客网 时间:2024/06/09 13:56

题目描述

对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。

给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。

测试样例:
[1,3,5,7,9],5,3
返回:1

<分析>:
1.题目没给出数组是升序还是降序,故需要判断是升序还是降序
2.需要返回查找元素第一次出现的位置,那么当找到时,需要判断是否是第一次出现
package com.ex.string;/** *  * @author zy * @date 2017年10月18日 下午2:59:23 * @Decription 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 *             给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。 *             若该元素出现多次,请返回第一次出现的位置。 */public class Ex10 {    public int getPos(int[] A, int n, int val) {        // write code hereif (A==null || n==0) {return -1;}int low=0;int high=n;//升序if (A[0]<A[n-1]) {while(low<=high){int mid=(low+high)/2;if (A[mid]==val) {return findFirstPos(A, val, mid);}else if (A[mid]>val) {high = mid-1;}else {low = mid+1;}}}//降序if (A[0]>A[n-1]) {while(low<=high){int mid=(low+high)/2;if (A[mid]==val) {return findFirstPos(A, val, mid);}else if (A[mid]>val) {low=mid+1;}else {high=mid+1;}}}    return -1;    }        private int findFirstPos(int[] A,int val,int position){    while(position>=0 && A[position]==val){    position--;    }    return position+1;    }}




原创粉丝点击