问题描述
给定一个不包含重复元素的N行M列二维矩阵,求矩阵的极小值。极小值的定义如下:若一个值是极小值,四连通方向上的的不越界的邻居都比它大。
思路
二维比较难想,我们从一维说起。
对于一维数组来说,如何寻找极小值?
二分法,找到中间位置x,如果x-1处的元素比x+1处的元素小,那么0~x-1之间必然存在一个极小值,从而缩小了范围。
升到二维,这个问题等价于。在平原上,寻找一个坑。这其实非常简单,我们只需要任选一点,从这个点出发始终朝着低处走,一定能够找到极小值点。
升到二维,首先也要想到分治法,降低复杂度。
对于矩阵较长的那个轴,二分之,切一刀。在刀痕处寻找极小值,极小值所在的那一侧必然是包含极小值的。
总之,这个问题只有一个思路:目前发现的最小值所在的区域一定包含极小值。关键在于划分区域的时候要严格保证最小值不会流出区域。
代码
import java.util.Random;
class Main {
int[][] a;
Random r = new Random();
void generate() {
int rows = r.nextInt(10) + 5;
int cols = r.nextInt(10) + 5;
a = new int[rows][cols];
int b[] = new in