大概每日一题
公众号新开了个栏目, 叫大概每日一题.
那么问题来了, 为啥叫大概每日一题呢?
今天的题
题目描述:
找出具有m行n列二维数组Array的“鞍点”(保证只有一个),即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10。
输入:
第一行有两个数m和n,下面有m行,每行有n个数。
输出:
Array[i][j]=x表示第i行第j列的x是一个"鞍点"
做题思路
这道题的思路还是比较清晰的: 枚举每一行, 寻找这一行里最大的数在第几列, 寻找那一列最小的数, 看看这一行最大的数是不是这一列最小的数.
伪代码:
输入m,n循环i从0到m-1 循环j从0到n-1 读入data[i][j]循环i从0到m-1 max=data[i][0] pos=0 循环j从0到n-1 如果data[i][j] 大于 max 更新max与pos flag = 1 循环j从0到n-1 如果data[j][pos]小于max flag = 0 如果flag=1 说明data[i][pos]是鞍点 输出, 退出程序如果程序执行到了这里, 说明没有鞍点输出None, 退出程序.
注意点
在找数组的最小值的时候有两种实现方式:
int min = 0x70000000;int pos = -1;for(int i = 0; i < n;++ i){ if(min < data[i]){ min = data[i]; pos = i; }}
与
int min = data[0];int pos = 0;for(int i = 1; i < n;++ i){ if(min < data[i]){ min = data[i]; pos = i; }}
第一种方式将min设为极大值(或将max设为极小值), 第二种方式将min设为数组第一项的值.
这两种方式都是正确的, 要注意的就是
使用第一种方式时:
1.int所能存储的最大值是0x7fffffff, 所以对于以上情况把min设置为0x7ffffff是安全的.
2.对于要比较min+data[i]和data[i]的大小的时候, min的初值应设置为int所能存储的最大值的一半, 以保证min+data[i]仍在int范围内. 对于这种情况, 0x3f3f3f3f是一个安全的值.
使用第二种方式时:
一定要把pos变量初始化为0