int binarySearch(vector<int>& nums, int target, bool lower) { int left = 0, right = (int)nums.size() - 1, ans = (int)nums.size(); while (left <= right) { int mid = (left + right) / 2; if (nums[mid] > target || (lower && nums[mid] >= target)) { right = mid - 1; ans = mid; } else { left = mid + 1; } } return ans; } int search(vector<int>& nums, int target) { int leftIdx = binarySearch(nums, target, true); int rightIdx = binarySearch(nums, target, false) - 1; if (leftIdx <= rightIdx && rightIdx < nums.size() && nums[leftIdx] == target && nums[rightIdx] == target) { return rightIdx - leftIdx + 1; } return 0; } 详细解释代码
时间: 2024-01-15 17:03:40 浏览: 124
这段代码实现了在有序数组中查找某个元素的出现次数。
函数 `binarySearch` 是一个二分查找函数,其中 `nums` 是有序数组,`target` 是目标值,`lower` 表示是否查找第一个大于等于目标值的元素。如果 `lower` 为 true,则查找第一个大于等于目标值的元素,否则查找第一个大于目标值的元素。如果找到了符合条件的元素,则返回其下标;否则,返回数组的长度。
函数 `search` 利用 `binarySearch` 函数分别查找目标值在有序数组中第一次和最后一次出现的位置,然后计算出现次数。具体步骤如下:
1. 调用 `binarySearch(nums, target, true)` 查找目标值第一次出现的位置,保存在变量 `leftIdx` 中。
2. 调用 `binarySearch(nums, target, false) - 1` 查找目标值最后一次出现的位置,然后减 1,保存在变量 `rightIdx` 中。
3. 如果目标值在数组中出现过,并且第一次和最后一次出现的位置都找到了,则返回它们之间的元素个数,即 `rightIdx - leftIdx + 1`。
4. 如果目标值在数组中没有出现过,则返回 0。
值得注意的是,这段代码中的二分查找算法是一个通用的模板,可以用来查找大于等于或大于目标值的元素位置。同时,二分查找的时间复杂度为 O(log n),比暴力查找的时间复杂度 O(n) 要快得多。
相关问题
vector数组查找
在C++中,可以使用`std::vector`容器进行数组的查找操作。`std::vector`提供了多种查找函数,包括线性查找和二分查找。
1. 线性查找:可以使用`std::find`函数进行线性查找,该函数在`<algorithm>`头文件中。它接受两个迭代器作为参数,表示要查找的范围,以及要查找的值。如果找到了该值,返回指向该元素的迭代器;如果未找到,则返回指向尾后位置的迭代器。
示例代码:
```cpp
#include <vector>
#include <algorithm>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
int target = 3;
auto it = std::find(nums.begin(), nums.end(), target);
if (it != nums.end()) {
std::cout << "Found at index: " << std::distance(nums.begin(), it) << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
return 0;
}
```
2. 二分查找:如果`std::vector`中的元素是有序的,可以使用`std::binary_search`函数或`std::lower_bound`函数进行二分查找。`std::binary_search`返回一个bool值,表示是否找到了目标值;`std::lower_bound`返回一个指向第一个不小于目标值的元素的迭代器。
示例代码:
```cpp
#include <vector>
#include <algorithm>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
int target = 3;
bool found = std::binary_search(nums.begin(), nums.end(), target);
if (found) {
std::cout << "Found" << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
auto it = std::lower_bound(nums.begin(), nums.end(), target);
if (it != nums.end() && *it == target) {
std::cout << "Found at index: " << std::distance(nums.begin(), it) << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
return 0;
}
```
注意:以上示例代码仅为演示查找操作的基本用法,实际使用时需要根据具体需求进行适当的修改。
c++ vector查找
C++ 的 vector 类型提供了多种查找元素的方法。下面是一些常用的方法:
1. 使用 find 函数
vector<int> nums = {1, 2, 3, 4, 5};
auto it = find(nums.begin(), nums.end(), 3);
if (it != nums.end()) {
cout << "Found element: " << *it << endl;
} else {
cout << "Element not found" << endl;
}
2. 使用 count 函数
vector<int> nums = {1, 2, 3, 2, 4, 2, 5};
int count = count(nums.begin(), nums.end(), 2);
cout << "Found " << count << " occurrences of 2" << endl;
3. 使用 binary_search 函数
vector<int> nums = {1, 2, 3, 4, 5};
bool found = binary_search(nums.begin(), nums.end(), 3);
if (found) {
cout << "Element found" << endl;
} else {
cout << "Element not found" << endl;
}
注意:在使用这些函数之前,需要包含相应的头文件。例如,find 函数在 algorithm 头文件中定义。
阅读全文