经典的二分查找:给出一个有序数组以及一个目标值target,要求返回target在数组中的位置,若数组里不存在target,则返回-1。
public class Solution {
/**
* @param nums: An integer array sorted in ascending order
* @param target: An integer
* @return an integer
*/
public int findPosition(int[] nums, int target) {
// Write your code here
if(nums == null || nums.length == 0){
return -1;
}
int len = nums.length;
int left = 0;
int right = len-1;
while(left+1 < right){
int mid = left + (right-left)/2;
if(nums[mid] == target){
return mid;
}else if(nums[mid] > target){
right = mid-1;
}else{
left = mid+1;
}
}
return -1;
}
}
#14.First Position of Target: 查找有序数组中目标值第一次出现的位置(数组中可能存在多个相同的目标值)
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 == null || nums.length == 0){
return -1;
}
int len = nums.length;
int left = 0;
int right = len-1;
while(left <= right){
int mid = left + (right-left)/2;
if(nums[mid] == target){
while(mid > 0 && nums[mid] == nums[mid-1]){
mid--;
}//查找前面是否还有等于目标值的元素
return mid;
}else if(nums[mid] > target){
right = mid-1;
}else{
left = mid+1;
}
}
return -1;
}
}
public class Solution {
public int mySqrt(int x) {
if(x == 0){
return 0;
}
if(x < 0){
return -1;
}
int left = 1;
int right = x;
while(left <= right){
int mid = left + (right-left)/2;
if(mid == x/mid){
return mid;
}else if(mid < x/mid){
left = mid+1;
}else{
right = mid-1;
}
}
return right;//这里return right是因为开方时,向下取值(例如根号10的值为3而不是4)
}
}