二分法的几种使用
参数列表
目标值 | 目标数组 |
---|---|
int tar | int[ ] arr |
一、arr中含有tar值
//样例
public static void main(String[] args) {
int[] arr = new int[]{1,3,4,5,6,7,9};
for(int i=0;i<=10;i++){
int tar = i;
System.out.println("tar为:"+tar+" --> "+ new Test().f1(tar,arr));
}
}
public int f1(int tar, int[] arr) {
int l=0,r=arr.length;
while(l<r){
int mid = l+(r-l)/2;
if(arr[mid]>curv){
r=mid;
}else if(arr[mid]<curv){
l=mid+1;
}else {
return mid;
}
}
return -1;
}
//结果
tar为:0 --> -1
tar为:1 --> 0
tar为:2 --> -1
tar为:3 --> 1
tar为:4 --> 2
tar为:5 --> 3
tar为:6 --> 4
tar为:7 --> 5
tar为:8 --> -1
tar为:9 --> 6
tar为:10 --> -1
二、arr中可以不含有tar值
1、求arr中大于等于tar的数的最小位置
//样例
public static void main(String[] args) {
int[] arr = new int[]{1,3,4,5,6,7,9};
for(int i=0;i<=10;i++){
int tar = i;
System.out.println("tar为:"+tar+" --> "+ new Test().f2(tar,arr));
}
}
public int f2(int tar, int[] arr) {
int l=0,r=arr.length;
while(l<r){
int mid = l+(r-l)/2;
if(arr[mid]>tar){
r=mid;
}else if(arr[mid]<tar){
l=mid+1;
}else {
r=mid;
}
}
return l;
}
//结果
tar为:0 --> 0
tar为:1 --> 0
tar为:2 --> 1
tar为:3 --> 1
tar为:4 --> 2
tar为:5 --> 3
tar为:6 --> 4
tar为:7 --> 5
tar为:8 --> 6
tar为:9 --> 6
tar为:10 --> 7
2、求arr中大于tar的数的最小位置
//样例
public static void main(String[] args) {
int[] arr = new int[]{1,3,4,5,6,7,9};
for(int i=0;i<=10;i++){
int tar = i;
System.out.println("tar为:"+tar+" --> "+ new Test().f3(tar,arr));
}
}
public int f3(int tar, int[] arr) {
int l=0,r=arr.length;
while(l<r){
int mid = l+(r-l)/2;
if(arr[mid]>tar){
r=mid;
}else if(arr[mid]<tar){
l=mid+1;
}else {
l=mid+1;
}
}
return l;
}
//结果
tar为:0 --> 0
tar为:1 --> 1
tar为:2 --> 1
tar为:3 --> 2
tar为:4 --> 3
tar为:5 --> 4
tar为:6 --> 5
tar为:7 --> 6
tar为:8 --> 6
tar为:9 --> 7
tar为:10 --> 7
三、最后有兴趣的可以试一下若arr中的数非正序,而是逆序的情况
//样例
public static void main(String[] args) {
int[] arr = new int[]{9,7,6,5,4,3,1};
for(int i=0;i<=10;i++){
int tar = i;
System.out.println("tar为:"+tar+" --> "+ new Test().f4(tar,arr));
}
}
1、求arr中小于等于tar的数的最小位置
2、求arr中小于tar的数的最小位置
3、感兴趣的可以写一下这道题目(不用动态规划)
https://www.nowcoder.com/practice/218f3db1f66d465bbf9578625aa90785