题目出处点这里
思路:二分查找,不过要注意返回第一个出现目标值的索引位置。只要当arr[mid]==mubiao时也继续向左查找,最后输出left或right即可解决这个问题
代码:
package binaryFindAndAnswer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class P2249 {
static int[] arr;
static int res;
static int n;
static int m;
public static void main(String[] args) throws IOException {
StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
st.nextToken();
n = (int)st.nval;
st.nextToken();
m = (int)st.nval;
arr = new int[n + 1];
arr[0] = -1;//有可能会要查找等于0的数,所以我们把第一个改成-1
for (int i = 1; i <= n; i++) {
st.nextToken();
arr[i] = (int)st.nval;
}
for (int i = 1; i <= m; i++) {
st.nextToken();
res = binary((int)st.nval);
System.out.print(res + " ");
}
}
// 写一个二分查找
/**
* 我们需要找的是第一次出现目标值的索引
*
* @param dest要查找的目标值
* @return返回第一次出现的索引
*/
public static int binary(int dest) {
int l = 1, r = n;
while (l < r) {// 其实就是l != r,在这里l不可能大于r
int mid = l + (r - l) / 2;
if (arr[mid] >= dest) {// 如果中间值大于等于目标值就继续往左边找
r = mid;
} else {
l = mid + 1;
}
}
if (arr[l] == dest) {
return l;
} else {
return -1;
}
}
}