题目:给定一个含有 N^2 个不同整数的NxN数组a[]。设计一个运行时间和N成正比的算法来找出一个局部最小元素。满足a[i][j] < a[i+1][j]、a[i][j] < a[i-1][j]、a[i][j] < a[i][j-1]、a[i][j] < a[i][j+1]
。
代码实现
/*------------------------矩阵的局部最小元素--------------------*/
//解题思路
//仿照数据的局部最小元素:每次查找的方向总是小于上一次查找的值(列和行分开看)
//算法设计如下
#include <vector>
using namespace std;
void MatrixPartMinElu(vector<vector<int>> v, int *row, int *col)
{
//i 和 j是传出的矩阵下标参数
//行参数
int Rlo = 0;
int Rhi = v.size() - 1;
int Rmid;
//列参数
int Clo = 0;
int Chi = v[0].size() - 1;
int Cmid;
while (Rlo <= Rhi && Clo <= Chi)
{
Rmid = Rlo + (Rhi - Rlo) / 2;
Cmid = Clo + (Chi - Clo) / 2;
//看中间mid大于那个值,每次都向小的继续查找(注意使用二分时一定要有+1/-1,避免死循环)
if (Rmid != v.size() && v[Rmid][Cmid] > v[Rmid + 1][Cmid])//前面的判断避免行上溢
Rlo = Rmid + 1;
else if (Rmid != 0 && v[Rmid][Cmid] > v[Rmid - 1][Cmid])//前面的判断避免行下溢
Rhi = Rmid - 1;
else if (Cmid != v[0].size() && v[Rmid][Cmid] > v[Rmid][Cmid + 1])//前面的判断避免列上溢
Clo = Cmid + 1;
else if (Cmid != 0 && v[Rmid][Cmid] > v[Rmid][Cmid - 1])//前面的判断避免列下溢
Chi = Cmid - 1;
else
{
*row = Rmid;
*col = Cmid;
return;
}
}
}