剑指 Offer 53 - I. 在排序数组中查找数字 I
这道题的链接: 剑指 Offer 53 - I. 在排序数组中查找数字 I
这道题我们在和面试官对线时要注意,这个数据是排好序的,所以我们不能用最土的for循环遍历方法,写出来估计面试官就和你说拜拜了,我们应该使用二分法,我们可以用一个left索引和right索引来找数字target左右边界,然后一减就得到target的数量了。具体代码如下:
class Solution{
public int search(int[] nums, int target){
if (nums.length == 0) return 0;
return binarySearch(nums, taget + 1) - binarySearch(nums, target);
}
private int binarySearch(int[] nums, int target){
int left = 0, right = nums.length;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target){
left = mid + 1;
} else {
right = mid;
}
}
return right;
}
}
还有另一个代码的写法如下:
class Solution{
public int binarySearch(int[] nums, int target){
if(nums == null || 0 == nums.length) {
return -1;
}
int r = nums.length - 1;
int l = 0;
int mid = (l + r) / 2;
while(nums[mid] != target && 1 != r) {
if (target > nums[mid]) {
l = mid + 1;
} else {
r = mid;
}
mid = (l + r) / 2;
}
if (target == nums[mid]) {
return mid;
}
return -1;
}
}
另外一种方法就是双指针,双指针用法好广呀
class Solution {
public int search(int[] nums, int target) {
int res = 0;
if(null != nums && 0 != nums.length) {
int l = 0;
int r = nums.length - 1;
int mid = (l + r) / 2;
while (nums[mid] != target && l != r){
if (target > nums[mid]){
l = mid + 1;
} else {
r = mid;
}
mid = (l + r) / 2;
}
if(nums[mid] == target) {
for(int i = mid - 1 ;i >=0; --i){
if (targey != nums[i]) {
break;
}
++res;
}
for (int i = mid + 1; i< nums.length; ++i){
if (targey != nums[i]) {
break;
}
++res;
}
}
}
return res;
}
}