- 操作系统:ubuntu22.04
- IDE:Visual Studio Code
- 编程语言:C++11
题目描述
这道题有多个变体,最常见的是:
在一个排序数组中找出某个数字出现的次数。
也可以扩展为:
找出某个数字第一次出现的位置;
找出某个数字最后一次出现的位置;
返回该数字的起始和结束位置。
解法思路:二分查找
由于数组是有序的,我们可以使用高效的二分查找算法来定位目标值的起始和结束位置。
示例:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
解释: 数字 8 出现了两次
代码
#include <vector>
using namespace std;
class Solution {
public:
int search( vector< int >& nums, int target )
{
// 找第一个等于 target 的位置
int first = findFirst( nums, target );
if ( first == -1 )
return 0;
// 找最后一个等于 target 的位置
int last = findLast( nums, target );
return last - first + 1;
}
private:
// 找第一个等于 target 的位置
int findFirst( vector< int >& nums, int target )
{
int left = 0, right = nums.size() - 1;
while ( left <= right )
{
int mid = left + ( right - left ) / 2;
if ( nums[ mid ] < target )
left = mid + 1;
else
right = mid - 1; // 继续向左找
}
return ( left < nums.size() && nums[ left ] == target ) ? left : -1;
}
// 找最后一个等于 target 的位置
int findLast( vector< int >& nums, int target )
{
int left = 0, right = nums.size() - 1;
while ( left <= right )
{
int mid = left + ( right - left ) / 2;
if ( nums[ mid ] > target )
right = mid - 1;
else
left = mid + 1; // 继续向右找
}
return ( right >= 0 && nums[ right ] == target ) ? right : -1;
}
};
#include <iostream>
#include <vector>
int main()
{
Solution sol;
vector< int > nums = { 5, 7, 7, 8, 8, 10 };
cout << "数字 8 出现次数:" << sol.search( nums, 8 ) << endl; // 输出 2
cout << "数字 6 出现次数:" << sol.search( nums, 6 ) << endl; // 输出 0
return 0;
}
运行结果
数字 8 出现次数:2
数字 6 出现次数:0