C++判断Vector里存在的峰值个数
时间: 2024-05-06 21:18:41 浏览: 50
峰值是指一个元素大于其相邻元素,可以采用遍历一遍vector,判断当前元素是否大于前后相邻元素来实现。
以下是示例代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int peakCount(vector<int> arr) {
int count = 0;
for(int i = 1; i < arr.size() - 1; i++) {
if(arr[i] > arr[i-1] && arr[i] > arr[i+1]) {
count++;
}
}
return count;
}
int main() {
vector<int> arr = {1, 2, 3, 4, 3, 2, 1};
int count = peakCount(arr);
cout << "The number of peaks in the vector is: " << count << endl;
return 0;
}
```
输出结果为:
```
The number of peaks in the vector is: 2
```
相关问题
opencv 直方图峰值 C++
OpenCV是一个开源计算机视觉库,它提供了一套完整的工具集来进行图像处理和分析。直方图(Histogram)是描述图像像素强度分布的一种图形表示,每个像素值对应于直方图中的一个条形,高度表示该像素值的数量。
在C++中,OpenCV提供了`cv::Mat`类型的直方图函数`calcHist()`,用于计算图像的灰度或彩色直方图。如果你想要找到峰值(即频率最高的像素值),可以按照以下步骤操作:
1. 首先,读取图像并将其转换为灰度图像(如果需要)。
```cpp
cv::Mat src = cv::imread("image.jpg");
cv::Mat gray;
cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
```
2. 计算直方图。
```cpp
std::vector<cv::Mat> channels(1, gray); // 如果是彩色图片则传入三个通道
cv::Mat hist;
cv::calcHist(channels.begin(), channels.size(), NULL, hist, cv::Mat(), {0}, cv::Range(0, 256));
```
3. 找到峰值(这里通常通过遍历直方图数组,找出最大值的位置)。
```cpp
int peakValue, maxIndex;
double maxValue = *hist.at<double>(0).maxCoeff(&peakValue, &maxIndex);
```
4. 输出或进一步分析峰值值及其对应的像素值范围。
请注意,这只是一个基本示例,实际应用中可能还需要对平滑、阈值等预处理步骤进行调整,并确保正确选择直方图的通道。
一个100*100的网格,里面包含随机0-100数字,设计一个算法,找到所有峰值,并输出网格下标C++
好的,下面是一个C++实现的分治算法,用于在一个100*100的网格中找到所有峰值,并输出网格下标:
```c++
#include <iostream>
#include <vector>
using namespace std;
void find_peak(vector<vector<int>>& matrix, int start_col, int end_col, int row, vector<pair<int, int>>& result) {
int mid_col = (start_col + end_col) / 2;
int max_row = row;
int max_val = matrix[row][mid_col];
for (int i = 0; i < matrix.size(); i++) {
if (matrix[i][mid_col] > max_val) {
max_val = matrix[i][mid_col];
max_row = i;
}
}
if ((mid_col == start_col || matrix[max_row][mid_col-1] <= max_val) && (mid_col == end_col || matrix[max_row][mid_col+1] <= max_val)) {
result.push_back(make_pair(max_row, mid_col));
} else if (mid_col > start_col && matrix[max_row][mid_col-1] > max_val) {
find_peak(matrix, start_col, mid_col-1, max_row, result);
}
if (mid_col < end_col && matrix[max_row][mid_col+1] > max_val) {
find_peak(matrix, mid_col+1, end_col, max_row, result);
}
}
vector<pair<int, int>> find_all_peaks(vector<vector<int>>& matrix) {
vector<pair<int, int>> result;
find_peak(matrix, 0, matrix[0].size()-1, 0, result);
return result;
}
int main() {
vector<vector<int>> matrix(100, vector<int>(100));
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
matrix[i][j] = rand() % 101;
}
}
vector<pair<int, int>> result = find_all_peaks(matrix);
for (int i = 0; i < result.size(); i++) {
cout << "Peak found at (" << result[i].first << ", " << result[i].second << ")" << endl;
}
return 0;
}
```
这个算法的时间复杂度也是O(m log n),其中m是矩阵的行数,n是矩阵的列数。
阅读全文