请实现无重复数字的升序数组的二分查找
给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1
数据范围:
, 数组中任意值满足
进阶:时间复杂度
,空间复杂度
[-1,0,3,4,6,10,13,14],13
6
13 出现在nums中并且下标为 6
[],3
-1
nums为空,返回-1
[-1,0,3,4,6,10,13,14],2
-1
2 不存在nums中因此返回 -1
数组元素长度在[0,10000]之间数组每个元素都在 [-9999, 9999]之间。
public int search (int[] nums, int target) {
// write code here
return search(nums,target,0,nums.length-1);
}
public int search(int[] nums,int target,int left,int right){
if(left == right || left == right-1){ //边界处理
if(nums[left] == target){
return left;
}else if(nums[right] == target){
return right;
}else {
return -1;
}
}
int mid = (left + right) / 2;
if(nums[mid] == target){
return mid;
}else if(nums[mid] < target){
return search(nums,target,mid,right);
}else if(nums[mid] > target){
return search(nums,target,left, mid);
}
return -1;
} public int search (int[] nums, int target) {
int start_index = 0;
int end_index = nums.length-1;
while(start_index <= end_index){
int mid_index = (start_index + end_index)/2;
if(nums[mid_index] == target){
return mid_index;
}
if(nums[mid_index] < target){
start_index = mid_index +1;
}else{
end_index = mid_index - 1;
}
}
return -1;
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param target int整型
* @return int整型
*/
public int search (int[] nums, int target) {
// write code here
// 算法的时间复杂度O(logN),额外空间复杂度O(1)
// 1.定义左边界l和右边界r
int l = 0;
int r = nums.length - 1;
int mid = 0;
while (l <= r) {
// 2.循环二分查找
// 2.1 先计算中间索引mid
mid = (l + r) / 2;
if (target == nums[mid]) {
// 2.2 若mid命中target,则返回mid
return mid;
} else if (target < nums[mid]) {
// 2.3 若target比mid的元素小,则收缩右边界r
r = mid - 1;
} else {
// 2.4 若target比mid的元素大,则收缩左边界l
l = mid + 1;
}
}
// 3.若循环结束仍没有返回,说明target不在nums中,返回-1
return -1;
}
} public int search (int[] nums, int target) {
// write code here
int len = nums.length;
if (len == 0) {
return -1;
}
int begin = 0 ; // 开始位置
int end = len - 1; // 结束位置
int mid = 0; // 中间位置
while (begin <= end) {
mid = (begin + end) / 2;
if (target == nums[mid]) {
return mid;
} else if (target < nums[mid]) {
end = mid - 1;
} else if (target > nums[mid]) {
begin = mid + 1;
}
}
return -1;
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param target int整型
* @return int整型
*/
public static int search(int[] nums, int target) {
// write code here
int left = 0;
int right = nums.length -1; //7
int mid = 0;
while (left <= right) {
mid = (left+right)/2;
if (nums.length == 0) {
return -1;
}
if (target == nums[mid]) {
return mid;
} else if (target < nums[mid]) {
right = mid -1;
} else {
left = mid + 1;
}
}
return -1;
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param target int整型
* @return int整型
*/
public int search (int[] nums, int target) {
// write code here
if (nums == null || nums.length == 0) {
return -1;
}
return binarySearch(nums, 0, nums.length - 1, target);
}
private int binarySearch(int[] nums, int left, int right, int target) {
if (left <= right) {
int mid = (left + right ) / 2 ;
if (nums[mid] == target) {
return mid;
}
if (nums[mid] > target) {
return binarySearch(nums, left, mid - 1, target);
} else {
return binarySearch(nums, mid + 1, right, target);
}
}
return -1;
}
} import java.util.*;
public class Solution {
/**
* 实现无重复数字的升序数组的二分查找
*
* 给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,
* 如果目标值存在返回下标(下标从 0 开始),否则返回 -1
*
*
* @param nums int整型一维数组
* @param target int整型
* @return int整型
*/
public int search (int[] nums, int target) {
if (null == nums || nums.length == 0) {
return -1;
}
return getTarget(nums, 0, nums.length - 1, target);
}
private int getTarget(int[] nums, int startIndex, int lastIndex, int target) {
//如果查找范围异常,返回-1
if (lastIndex - startIndex < 0) {
return -1;
}
//获取中间节点的下标
int mid = getMid(startIndex, lastIndex);
if (target == nums[mid]) {
return mid;
}
//目标比中间节点大,说明目标可能在中间节点右边,将查找下限设置为中间节点的下标
if (target > nums[mid]) {
startIndex = mid + 1;
}
//目标比中间节点小,说明目标可能在中间节点左边,将查找上限设置为中间节点的下标
else {
lastIndex = mid - 1;
}
//使用新的查找范围,再次查找目标
return getTarget(nums, startIndex, lastIndex, target);
}
/**
* 获取中间下标
*
*
* @param start int整型 最小下标
* @param end int整型 最大下标
* @return int整型 中间下标
*/
public int getMid(int start, int end) {
return (start + end) >> 1;
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param target int整型
* @return int整型
*/
public int search (int[] nums, int target) {
if (nums.length == 0) {
return -1;
}
int left = 0, right = nums.length;
if (target == nums[0]) {
return 0;
} else if (nums[right - 1] == target) {
return nums.length - 1;
} else {
while (left < right) {
int midIndex = (left + right) / 2;
if (nums[left] == target) {
return left;
} else if (right!=nums.length && nums[right] == target) {
return right;
} else {
if (nums[midIndex] == target) {
return midIndex;
} else if (nums[midIndex] > target) {
right = midIndex - 1;
} else {
left = midIndex + 1;
}
}
}
return -1;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
if (scanner.hasNext()) {
String inputLine = scanner.nextLine().trim();
System.out.println(inputLine);
if (inputLine.startsWith("[]")) {
System.out.println(-1);
return;
}
String[] numsAndTarget = inputLine.split("],");
String[] numStrArray = numsAndTarget[0].substring(1).split(",");
int[] nums = new int[numStrArray.length];
for (int i = 0; i < numStrArray.length; i++) {
nums[i] = Integer.parseInt(numStrArray[i]);
}
String target = numsAndTarget[1];
int targetNum = Integer.parseInt(target);
Solution binarySearch = new Solution();
int index = binarySearch.search(nums, targetNum);
System.out.println(index);
}
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param target int整型
* @return int整型
*/
public int search (int[] nums, int target) {
// write code here
int begin = 0;
int end = nums.length-1;
int mid = 0;
while(begin<=end){
mid = (begin+end)/2;
if(target == nums[mid]){
return mid;
}else if (target<nums[mid]){
end = mid -1;
}else if (target>nums[mid]){
begin = mid + 1;
}
}
return -1;
}
} public class Solution {
public int search (int[] nums, int target) {
// write code here
if(nums == null) return -1;
int low = 0;
int high = nums.length-1;
while(low <= high) {
int mid = (low + high)/2;
if(target > nums[mid]) {
low = mid+1;
}
else if(target < nums[mid]) {
high = mid-1;
}
else return mid;
}
return -1;
}
}