当前位置:网站首页>第一讲:寻找矩阵的极小值
第一讲:寻找矩阵的极小值
2022-07-07 06:51:00 【奋斗吧!骚年!】
题目:AcWing 1452. 寻找矩阵的极小值
给定一个 n×n 的矩阵,矩阵中包含 n×n 个 互不相同 的整数。
定义极小值:如果一个数的值比与它相邻的所有数字的值都小,则这个数值就被称为极小值。
一个数的相邻数字是指其上下左右四个方向相邻的四个数字,另外注意,处于边界或角落的数的相邻数字可能少于四个。
要求在 O(nlogn) 的时间复杂度之内找出任意一个极小值的位置,并输出它在第几行第几列。
本题中矩阵是隐藏的,你可以通过我们预设的 int 函数 query 来获得矩阵中某个位置的数值是多少。
例如,query(a,b) 即可获得矩阵中第 a 行第 b 列的位置的数值。
注意:
矩阵的行和列均从 0 开始编号。
query()函数的调用次数不能超过 (n+2)×⌈log2n⌉+n。
答案不唯一,输出任意一个极小值的位置即可。
数据范围
1≤n≤300,矩阵中的整数在int范围内。
输入样例:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
输出样例:
[0, 0]
题目分析:
第一种想到的方式就是从起点开始找比自己小的点,一直找,那么我们肯定会找到极小值(因为点各不相同)
但是最坏情况就是访问n2次。
第二种就是二分的方法,先在中间列找出最小值,然后看左右两边
1.如果 v<l,v<r那么v就是极小值
2.如果 l<v,那么左边有极小值
3.如果 r<v,那么右边有极小值
为什么呢?
假设右边 r<v,那么中间mid这一列都比r要大,那么我们用第一种方法寻找肯定不可能穿过mid这一列(因为会寻找比r小的数),那么在mid右边肯定有极小值,这样减少了一半的寻找量,如此反复最后就会找到。
// Forward declaration of queryAPI.
// int query(int x, int y);
// return int means matrix[x][y].
class Solution {
public:
vector<int> getMinimumValue(int n) {
typedef long long LL;
const LL INF = 1e15;
int l=0,r=n-1;
while(l<r) // 二分法
{
int mid = l + r >> 1;
LL val=INF;
int k=0; // 保存哪一行最小
for(int i=0;i<n;i++)
{
int t=query(i,mid);
if(t<val)
{
val=t;
k=i;
}
}
LL left=mid?query(k,mid-1):INF; // 查询左边
LL right=mid+1<n?query(k,mid+1):INF; // 查询右边
if(val<left&&val<right)return {
k,mid}; // 如果当前点是最小值
else if(left<val)r=mid-1;
else l=mid+1;
}
int k;
LL val=INF;
for(int i=0;i<n;i++)
{
int t=query(i,l);
if(t<val)
{
val=t;
k=i;
}
}
return {
k,l};
}
};
边栏推荐
- Yapi test plug-in -- cross request
- 12、 Sort
- 答案在哪里?action config/Interceptor/class/servlet
- esp8266使用TF卡并读写数据(基于arduino)
- MongoDB怎么实现创建删除数据库、创建删除表、数据增删改查
- C language pointer (exercises)
- 如何使用clipboard.js库实现复制剪切功能
- Unity shader (pass user data to shader)
- 正则匹配以XXX开头的,XXX结束的
- Leetcode question brushing record (array) combination sum, combination sum II
猜你喜欢
JVM garbage collection detailed learning notes (II)
Where is the answer? action config/Interceptor/class/servlet
Run can start normally, and debug doesn't start or report an error, which seems to be stuck
Install pyqt5 and Matplotlib module
Confitest of fixture py
Jenkins modifies the system time
Summary of PMP learning materials
Cesium does not support 4490 problem solution and cesium modified source code packaging scheme
Over 100000 words_ Ultra detailed SSM integration practice_ Manually implement permission management
Variable parameter of variable length function
随机推荐
Pick up the premise idea of programming
MySql数据库-事务-学习笔记
Sublime Text4 download the view in bower and set the shortcut key
十二、排序
Pycharm create a new file and add author information
Pytest installation (command line installation)
flinkcdc 用sqlclient可以指定mysqlbinlog id执行任务吗
Locust performance test 3 (high concurrency, parameter correlation, assembly point)
Add new item after the outbound delivery order of SAP mm sto document is created?
Serializer & modelserializer of DRF serialization and deserialization
Unittest simple project
Netease cloud wechat applet
Postman setting environment variables
Postman interface test (I. installation and use)
MySql数据库-索引-学习笔记
STM32 and motor development (from stand-alone version to Networking)
[SVN] what is SVN? How do you use it?
Oracle安装增强功能出错
C language pointer (Part 1)
Jenkins+ant+jmeter use