一 普通二分搜索
LintCode 457. Classical BInary Search
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
int ans = -1;
if(nums == null || nums.length == 0)
return ans;
int L = 0;
int R = nums.length - 1;
while(L <= R) {
int mid = L + ((R-L) >> 1);
if(nums[mid] == target)
return mid; //如果找到了,则返回
else if(nums[mid] > target)
R = mid - 1;
else
L = mid + 1;
}
return ans; //跳出while了,肯定是没有找到
}
}
二 查找满足条件的第一个位置
LintCode 14. First Position of Target
public 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
int ans = -1;
if(nums == null || nums.length == 0)
return ans;
int L = 0;
int R = nums.length - 1;
while(L <= R) {
int mid = L + ((R-L) >> 1);
if(nums[mid] >= target) {
R = mid - 1;
ans = nums[mid] == target ? mid : ans;
}
else {
L = mid + 1;
}
}
return ans;
}
}
类似题目:
LintCode 74. First Bad Version
LeetCode 278. First Bad Version
三 查找满足条件的最后一个位置
LintCode 458. Last Position of Target
public class Solution {
/**
* @param nums: An integer array sorted in ascending order
* @param target: An integer
* @return: An integer
*/
public int lastPosition(int[] nums, int target) {
// write your code here
int ans = -1;
if(nums == null || nums.length == 0)
return ans;
int L = 0;
int R = nums.length - 1;
while(L <= R) {
int mid = L + ((R-L) >> 1);
if(nums[mid] <= target) {
L = mid + 1;
ans = nums[mid] == target ? mid : ans;
}
else
R = mid - 1;
}
return ans;
}
}