package com.example.demo.subject1;
/**
* @version: 1.00.00
* @description: 二分查找
* @author: zrh
* @date 2021/4/19 16:46
*/
public class Search {
public static void main(String[] args) {
int[] a = {1,2,2,4};
Search search = new Search();
int search1 = search.search(a, 2);
System.err.println(search1);
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 下面的那个方法加了一些逻辑判断
* 如果目标值存在返回下标,否则返回 -1
* @param nums int整型一维数组
* @param target int整型
* @return int整型
*/
public int search (int[] nums, int target) {
int start = 0;
int end = nums.length;
int mid = (start + end) / 2;
if(nums.length > 0 || target > nums[end-1]) {
return -1;
}
while (true) {
if(target == nums[mid] ) {
if(mid > 0) {
if(nums[mid] == nums[mid -1]) {
end = mid;
mid = (start + end) / 2;
}else {
return mid;
}
} else {
return mid;
}
} else if(target > nums[mid]){
start = mid;
mid = (start + end) / 2;
} else {
end = mid;
mid = (start + end) / 2;
}
if(start == end) {
return -1;
}
}
}
/**
* 如果数据无重复的话
* @param nums
* @param target
* @return
*/
public int simpleSearch (int[] nums, int target) {
//开始位置
int start = 0;
//结束位置
int end = nums.length;
//中间的位置
int mid = (start + end) / 2;
//如果目标值比最大值大,则返回-1
if(target > nums[end-1]) {
return -1;
}
//死循环
while (true) {
//如果相等,则返回
if(target == nums[mid]) {
return mid;
//如果目标值大于中间值,则将起始的指针设置为中间指针
/*
* 如值数组为:123456
* 目标值为5
* 第一次5和3比较,5>3,则将起始位置设为3,,重新计算中间值
*/
} else if(target > nums[mid]){
start = mid;
mid = (start + end) / 2;
} else {
end = mid;
mid = (start + end) / 2;
}
//如果起始和末尾地址相同,则代表没找到
if(start == end) {
return -1;
}
}
}
}