在一个有重复元素的数组中查找 key 的最左(右)位置

package leetcode;

import org.testng.annotations.Test;

/**
 * Created by fangjiejie on 2019/9/21.
 */
public class BinarySearch {

    @Test
    public void test() {
        int a[] = {1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10};
        int key = 4;
        System.out.print(binarySearch(a, key));
    }
    /*
    * 在一个有重复元素的数组中查找 key 的最左位置
    * */
    public int binarySearch(int[] nums, int key) {
        int l = 0, h = nums.length - 1;
        while (l < h) {
            int m = l + (h - l) / 2;
            if (nums[m] > key) {
                h = m - 1;
            } else if (nums[m] < key) {
                l = m + 1;
            } else {
                h = m;
            }
        }
        return l;
    }

    /*
    * 在一个有重复元素的数组中查找 key 的最右位置
    * 之所以引入变量maxIndex是因为当key=a[mid]时,如果直接将left=mid,进入下一次循环时,mid=(left+right)/2=left(向下取整).将陷入无限循环
    * 所以引入maxIndex变量保存最大值,当key=a[mid]时,将left=mid+1,看后面是否还有与key相等的。值得注意的是,循环条件为left<=right
    * */
    @Test
    public void bs1() {
        int a[] = {1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10};
        int key = 4;
        int left = 0;
        int right = a.length - 1;
        int maxIndex = -1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (key >= a[mid]) {
                maxIndex = Math.max(maxIndex, mid);
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        System.out.print(maxIndex);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值