Problem 7:
For a given sorted array (ascending order) and a target
number, find the first index of this number in O(log n)
time complexity.
If the target number does not exist in the array, return -1
.
数组设置start,end,mid变量进行index循环比较,start=end时也就是指的是同一个元素时跳出循环,此时判断array[start]是否与target一致:
class Solution {
public:
/**
* @param nums: The integer array.
* @param target: Target number to find.
* @return: The first position of target. Position starts from 0.
*/
int binarySearch(vector<int> &array, int target) {
// write your code here
//Using binary search
if(array.empty()||array.size() == 0 )
return -1;
int start = 0, end = array.size()-1;
while(start < end){
int mid = start + (end - start)/2;
if(array[mid] == target)
end = mid;
else if (array[mid] < target)
start = mid +1;
else
end = mid -1;
}
if(array[start] == target)
return start;
return -1;
}
};
若当start = end -1 时跳出循环,此时start与end 相邻,需要判断start和end两个位置对应的值是否与target一致:
class Solution {
public:
/**
* @param nums: The integer array.
* @param target: Target number to find.
* @return: The first position of target. Position starts from 0.
*/
int binarySearch(vector<int> &array, int target) {
// write your code here
//Using binary search
if(array.empty()||array.size() == 0 )
return -1;
int start = 0, end = array.size() -1;
while(start +1 < end){
int mid = start + (end - start)/2;
if(array[mid] == target)
end = mid;
else if (array[mid] < target)
start = mid;
else
end = mid;
}
if(array[start] == target)
return start;
if(array[end] == target)
return end;
return -1;
}
};
上述两个方法是迭代实现,如果要递归实现:
class Solution {
/**
* @param nums: The integer array.
* @param target: Target to find.
* @return: The first position of target. Position starts from 0.
*/
public int binarySearch(int[] nums, int target) {
//write your code here
if(nums.length==1&&target==nums[0]) return 0;
int len = nums.length;
int index = binaryFind(nums,target,0,len);
return index;
}
public int binaryFind(int[] nums,int target,int left,int right){
int median = (left+right)/2;
if(nums[left]==target) return left;
if(left >= right ) return -1;
if(target == nums[median]&&target != nums[median-1]) return median;//获取最前匹配位置
if(target > nums[median]) return binaryFind(nums,target,median+1,right);
if(target <= nums[median]) return binaryFind(nums,target,left,median);
return -1;
}
}
递归算法参照
http://www.cnblogs.com/wangnanabuaa/p/4987304.html