任意区间的极值
1.首先介绍一种方法暴力搜索的方法,这个方法就是比较浪费时间:
#include <iostream>
#include <vector>
using namespace std;
vector<int> MinArr(int arr[],int n, int m)
{
vector<int> v;
int i , j;
for (i = 0; i < n; i++)
{
if (i == 0)
{
v.push_back(0);
}
else if (i < m)
{
v.push_back(arr[i - 1]);
}
else
{
int min = arr[i - m];
for (j = 0; j < i; j++)
{
if (arr[j] < min)
{
min = arr[j];
}
}
v.push_back(min);
}
}
return v;
}
int main()
{
vector<int> vi;
int arr[10] = { 4, 6, 1, 3, 4, 8, 9, 3, 2, 1 };
vi = MinArr(arr, 5, 2);
for (auto &i : vi)
{
cout << i << endl;
}
return 0;
}
2.这个方法就是今天的重点:ST算法
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int d[10000][10000];
int a[10000];
namespace RMQ
{
void init(int n)
{
for (int i = 1; i <= n; i++)
d[i][0] = a[i];
for (int j = 1; (1 << j) <= n; j++)
{
for (int i = 1; i + (1 << j) - 1 <= n; i++)
{
d[i][j] = max(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]);
}
}
}
int query(int l, int r)
{
int k = log2(r - l + 1);
return max(d[l][k], d[r - (1 << k) + 1][k]);
}
}
int main()
{
return 0;
}