在排序数组中查找数字
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8 输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6 输出: 0
提示:
- 0 <= nums.length <= 105
- -109 <= nums[i] <= 109
- nums 是一个非递减数组
- -109 <= target <= 109
分析
一般这种题目在有序数组中查找一个数字都采用二分查找法。
需要记住以下模板套用:
// 向下取整
int mid = (right - left) / 2 + left;
//向上取整
int mid = (right - left + 1) / 2 + left;
常⻅题型:
1.寻找第⼀个⼤于等于 target 的数
2.寻找第⼀个等于 target 的数
3.寻找最后⼀个⼤于等于 target 的数
4.寻找最后⼀个等于 target 的数
//寻找第⼀个等于 target 的数的下标
int search2(int[] nums, int target){
if(nums == null || nums.length <= 0){
return -1;
}
int left = 0, right = nums.length - 1;
while(left < right){
// 向下取整
int mid = (right - left) / 2 + left;
if(nums[mid] >= target){
right = mid;
}else{
left = mid + 1;
}
}
// 判断该数是否存在
if(nums[left] != target) return -1;
return left;
}
//4.寻找最后⼀个等于 target 的数下标
int search4(int[] nums, int target){
if(nums == null || nums.length <= 0){
return -1;
}
int left = 0, right = nums.length - 1;
while(left < right){
//向上取整
int mid = (right - left + 1) / 2 + left;
if(nums[mid] <= target){
left = mid;
}else{
right = mid - 1;
}
}
// 判断该数是否存在
if(nums[left] != target) return -1;
return left;
}
代码
class Solution {
public int search(int[] nums, int target) {
int i = search2(nums,target);
int j = search4(nums,target);
if(j==-1||i==-1){
return 0;
}
return j-i+1;
}
int search2(int[] nums, int target){
if(nums == null || nums.length <= 0){
return -1;
}
int left = 0, right = nums.length - 1;
while(left < right){
// 向下取整
int mid = (right - left) / 2 + left;
if(nums[mid] >= target){
right = mid;
}else{
left = mid + 1;
}
}
// 判断该数是否存在
if(nums[left] != target) return -1;
return left;
}
//4.寻找最后⼀个等于 target 的数下标
int search4(int[] nums, int target){
if(nums == null || nums.length <= 0){
return -1;
}
int left = 0, right = nums.length - 1;
while(left < right){
//向上取整
int mid = (right - left + 1) / 2 + left;
if(nums[mid] <= target){
left = mid;
}else{
right = mid - 1;
}
}
// 判断该数是否存在
if(nums[left] != target) return -1;
return left;
}
}
0~n-1中缺失的数字
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
分析
这种有序的数组采用二分查找时间复杂度最低,比较数组下标和数组值是否相等。
代码
class Solution {
public int missingNumber(int[] nums) {
int left = 0;
int right = nums.length-1;
while(left<right){
//向上取整
int mid = (right-left)/2+left;
if(nums[mid]==mid){
left = mid+1;
}else{
right = mid;
}
}
return nums[left]==left?left+1:left;
}
}