在一个有重复元素的数组中查找 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);
    }
}

发布了184 篇原创文章 · 获赞 60 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/StubbornAccepted/article/details/101116343