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);
}
}
在一个有重复元素的数组中查找 key 的最左(右)位置
最新推荐文章于 2022-05-26 11:25:15 发布