二分查找

本文介绍了如何使用二分查找算法在有序数组中寻找指定元素。给定有序数组A、其大小n和目标值val,算法返回元素在数组中的索引,若元素不存在则返回-1。
摘要由CSDN通过智能技术生成

题目描述

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

给定一个整数数组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 here
		if (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;
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值