剑指 Offer 53 - I. 在排序数组中查找数字 I && 34. 在排序数组中查找元素的第一个和最后一个位置
一、题目描述
1.题目内容
统计一个数字在排序数组中出现的次数。
2.题目示例
示例1
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例2
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
3.提示
0 <= 数组长度 <= 50000
注意:本题与主站 34 题相同(仅返回值不同):
34. 在排序数组中查找元素的第一个和最后一个位置
二、思路
显然,本题的思路为二分。
关键点在于二分搜索到target的策略。
错误的策略为向前向后搜寻相应的边界,这样会导致时间复杂度退化到O(n)。
正确的策略为二分得到相应的左右边界
三、数据结构资料
本题无需要的数据结构。
四、代码
class Solution
{
public int search(int[] nums, int target)
{
int left = 0;
int right = nums.length - 1;
int result = 0;
while(left <= right)
{
int mid = (left + right) / 2;
if(nums[mid] <= target)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
if(left > 0 && nums[left - 1] != target)
{
return 0;
}
result = left;
left = 0;
right = nums.length - 1;
while(left <= right)
{
int mid = (left + right) / 2;
if(nums[mid] < target)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
result = result - right - 1;
return result;
}
}
五、复杂度分析
时间复杂度O(logn)
空间复杂度O(1)
执行用时 | 时间击败比例 | 内存消耗 | 内存击败比例 |
---|---|---|---|
0ms | 100% | 41.4MB | 39% |