题很简单,注意对index的理解以及java语言的运用
题目:
Given an array of integers nums which is sorted in ascending order, and an integer target, write a function to search target in nums. If target exists, then return its index. Otherwise, return -1.
You must write an algorithm with O(log n) runtime complexity.
题解:
// Java
class Solution {
public int search(int[] nums, int target) {
// 二分搜索, 递归
int high = nums.length - 1;
int median = (int) nums.length/2;
return binarySearch(nums, target, 0, high, median);
}
private int binarySearch(int[] nums, int target, int low, int high, int median) {
// condition 1: just one number
if(median == low){
if(nums[low] == target) {
return low;
}
else if (nums[high] == target) {
return high;
}
else {
return -1;
}
}
// condition 2: more than one number
if(nums[median] == target){
return median;
}
else if(nums[median] > target){
return binarySearch(nums, target, low, median, (low+median)/2);
} else {
return binarySearch(nums, target, median, high, (high+median)/2);
}
}
}
知识点:
- 对nums.length()与nums.length的理解:nums.length是array的属性,而nums.length()是个方法,属于String类,注意区分,在python中是len()
- Java中float/double强制转int是向下取整,格式为(int) number,python也是向下取整,格式为int(number)
- 仔细考虑index位:
可以参考例子
该问题的产生可以理解为计算(median+high)/2的时候总是取左边的中间数,所以导致在(0,1)区间返回时产生循环,解决办法为判断high-low == 1或者当median == low,检查low与high两位。