给定n*n的数字矩阵,每行从左到右是严格递增, 每列也是严格递增,判断k是否在这个矩阵中

题目如下(昨晚大众点评的一个题目,貌似百度也曾考过)

最好的算法是去矩阵的最右下角或最左上角的元素,该元素在所在列和行为鞍点,即行最大列最小或者列最大行最小。例如,取最左下角的元素并记为a, 如果a>k,表明a所在的行都大于a,肯定不在此行上,只能往列去寻找,如果a<k表明a所在的列都小于k,因此肯定不在此列上,如此计算, 初始点为a[n-1][0],结束条件为i<0或者j>n,下面是代码,最差情况时间复杂度为2n-1,空间复杂度为1,比递归调用快多了。
template<class T>
bool matrixFind(T (*array)[5], int n, const T & val){
int i = n-1, j = 0;
while(i>=0 && j<=n-1){
if(a[i][j] > val){
i--;
}else if(a[i][j] < val){
j++;
}else{
return true;
}
}
return false;
}

转自: http://blog.csdn.net/jfkidear/article/details/7840576
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 题目描述: 给定一个m行n列的整数矩阵a,如果a的非边界元素a[i][j]大于相邻的上下左右4个元素,那么就称元素a[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。 输入格式: 输入在第一行给出矩阵a的行数m和列数n(3≤m,n≤20);最后m行,每行给出a在该行的n个元素的值。数字间以空格分隔。 输出格式: 每行按照“元素值 行号 列号”的格式输出一个局部极大值,其行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出 解题思路: 题目要求输出矩阵的局部极大值,因此需要遍历整个矩阵,对于每个非边界元素,判断是否大于相邻的上下左右4个元素,如果是,则输出该元素的值、行号和列号。 需要注意的是,对于第一行、最后一行、第一列和最后一列的元素,它们没有相邻的上下左右4个元素,因此不能判断它们是否为局部极大值。 代码实现: ### 回答2: 题目分析: 本题是一道模拟题,题目给出了一个矩阵,要求找出其的局部极大值。根据题意,局部极大值需要满足两个条件:它是非边界元素,且大于相邻的上下左右4个元素。因此,我们可以通过循环遍历矩阵所有的非边界元素,判断是否满足条件,如果满足,则输出它的值、行号和列号就可以了。 具体思路: 1.读入矩阵的行数m和列数n,以及矩阵a的值。 2.循环遍历矩阵所有的非边界元素。 3.对于每一个非边界元素,利用if语句判断是否大于相邻的上下左右4个元素。 4.如果满足条件,则输出它的值、行号和列号。 代码实现: ``` #include <iostream> #include <cstdio> using namespace std; int main() { int m, n, a[22][22]; //定义矩阵的行数、列数和矩阵a scanf("%d %d", &m, &n); //读入矩阵的行数和列数 for(int i=1; i<=m; i++) for(int j=1; j<=n; j++) scanf("%d", &a[i][j]); //读入矩阵a bool flag; //定义局部极大值的标志位 for(int i=2; i<=m-1; i++) //循环遍历矩阵所有的非边界元素 for(int j=2; j<=n-1; j++) { flag = true; //每次循环前将标志位初始化为true for(int k=i-1; k<=i+1; k++) //判断该元素是否大于相邻的上下左右4个元素 for(int l=j-1; l<=j+1; l++) { if(k==i && l==j) continue; //跳过该元素本身 if(a[i][j]<=a[k][l]) //如果不是局部极大值,则将标志位设为false { flag = false; break; } } if(flag) //如果是局部极大值,则输出它的值、行号和列号 printf("%d %d %d\n", a[i][j], i, j); } return 0; } ``` 时间复杂度分析: 本题的时间复杂度为O(m*n*9),其m为矩阵的行数,n为矩阵的列数,9表示每个元素最多需要判断相邻的9个元素。由于m和n的范围不超过20,因此算法的时间复杂度较小,可以通过本题。 ### 回答3: 本题要求找出矩阵的全部局部极大值及其所在的位置。首先需要根据题目的定义,判断一个元素是否为局部极大值。具体来说,对于矩阵的每一个非边界元素a[i][j],需要判断是否大于相邻的上下左右4个元素,即判断a[i][j]是否满足以下条件: 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] (右边界) 若满足条件,则a[i][j]为矩阵的局部极大值。 接下来需要寻找矩阵的所有局部极大值,并输出其所在的位置。由于输出要求按照行号递增输出,若同行有超过1个局部极大值,则该行按列号递增输出,因此需要按照顺序依次遍历矩阵的每一个元素,找出所有局部极大值的位置,并按照要求输出。 具体的方法是:对于矩阵每一个非边界元素,判断是否为局部极大值,若是则输出其位置,然后继续遍历矩阵下一个元素。需要注意的是,在遍历过程,边角处的元素需要特殊处理,因为边角处的元素有可能不存在某个方向上的相邻元素。 Python代码参考如下:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值