算法简介
ST算法是求解区间最值问题RMQ的高效算法,适用于静态空间的RMQ查询。ST算法做一次区间查询的复杂度是 O(1),m 次查询的总复杂度只有 O(m)。
ST算法基于一个简单原理:一个大区间若能被两个小区间覆盖,则大区间的最值可以用两个小区间的最值计算出来。
代码
public class ST {
public static void main(String[] args) {
//求解任意区间的最小值
int []x={10,9,8,4,11,15,6,8,10,5,6,3,2,4,2};
int n=x.length;
int m= (int) (Math.log(n)/Math.log(2));
int [][]dp=new int[m][n];
for (int i = 0; i < n; i++) {
dp[0][i]=x[i];
}
for (int i = 1; i < m; i++) {
for (int j = 0; j+(1<<i)<=n; j++) {
dp[i][j]=Math.min(dp[i-1][j],dp[i-1][j+(1<<(i-1))]);
}
}
Scanner scanner=new Scanner(System.in);
int l=scanner.nextInt();//区间下界
int r=scanner.nextInt();//区间上界
int c=(int)(Math.log(r-l)/Math.log(2));
int d=(int)Math.pow(2,c);
System.out.println(Math.min(dp[c][l],dp[c][r-d]));
}
}