首页 > 其他分享 >寻找矩阵的极小值

寻找矩阵的极小值

时间:2023-07-24 21:24:18浏览次数:49  
标签:val int 矩阵 寻找 mid query 极小值

title: 寻找矩阵的极小值
date: 2023-07-24 20:44:49
tags:
- c/c++
categories:
- 算法
- 笔试
top:

寻找矩阵的极小值

题目来自acwing

题目(点击跳转)

给定一个 n×n的矩阵,矩阵中包含 n×n个 互不相同 的整数。

定义极小值:如果一个数的值比与它相邻的所有数字的值都小,则这个数值就被称为极小值。

一个数的相邻数字是指其上下左右四个方向相邻的四个数字,另外注意,处于边界或角落的数的相邻数字可能少于四个。

要求在 O(nlogn) 的时间复杂度之内找出任意一个极小值的位置,并输出它在第几行第几列。

本题中矩阵是隐藏的,你可以通过我们预设的 int 函数 query来获得矩阵中某个位置的数值是多少。

例如,query(a,b) 即可获得矩阵中第 a行第 b 列的位置的数值。

注意:

  1. 矩阵的行和列均从 00 开始编号。
  2. query()函数的调用次数不能超过 (n+2)×⌈log2n⌉+n。
  3. 答案不唯一,输出任意一个极小值的位置即可。

数据范围

1≤n≤300,矩阵中的整数在int范围内。

输入样例:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

输出样例:

[0, 0]

思路:

二分

题目的意思是一个n*n的矩阵,里面每一个数都是互不相同的且都在int范围内,要找到一个极小值(这里答案不唯一),任意一个合法答案即可。这里极小值的定义就是小于和它相邻的任意一个数,如果在边上,那就是小于其他的数。

解法的话,就是使用二分,对矩阵的列进行二分,首先取出中间的一列,从上到小遍历出这一列的最小值,找到这个位置后,取出它左边和右边相邻的元素,然后进行比较

  • 如果左边和右边的元素都大于它,那么这个位置就是一个合法的答案。
  • 如果左边小于它,那么在左边的区域肯定可以找到一个合法的答案。
    • 这里可以描述一下,就是中间一列的最小值,然后左边的元素小于它,那么就可以顺着左侧元素开始找,不管如何找,不会穿过中间这一列到右边,所以左侧一定可以找到一个答案,那同理,右侧也是一样的。
  • 如果右边小于它,那么在右边的区域肯定也可以找到一个合法的答案。

假设这里左侧元素小,那么将左侧的二分之n列再进行二分,重复上面的操作,又可以将二分之n列分为二分之一,最后找到一列,在这一列上找到最小的值就是合法的极小值。

代码:

// 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;
        // 定义左边界和右边界
        int l = 0, r = n - 1;
        // 定义一个最大的数,方便在一列中寻找最小值时对变量进行初始化
        const int INF = 0x3f3f3f3f;
        // 二分列
        while(l < r) {
            // 取出列的中间一列,然后循环找到这一列的最小值
            int mid = (l + r) / 2;
            int k;
            int val = INF;
            for(int i = 0; i < n; i ++ ) {
                int t = query(i, mid);
                if(val > t) {
                    val = t;
                    k = i;
                }
            }
            // 找到最小值即为[k,mid],取出左右两边的元素,如果出界就为INF
            int left = mid ? query(k, mid - 1) : INF;
            int right = mid + 1 < n ? query(k, mid + 1) : INF;
            // 进行比较
            if(val < left && val < right) return {k, mid};
            if(val > left) r = mid - 1;
            else l = mid + 1;
        }
        // 次数L = R,也就是找到了答案所在的一列,进行遍历比较得出最小的数即为一个合法答案
        int k;
        int val = INF;
        for(int i = 0; i < n; i ++ ) {
            int t = query(i, r);
            if(val > t) {
                val = t;
                k = i;
            }
        }
        return {k, r};
    }
};

标签:val,int,矩阵,寻找,mid,query,极小值
From: https://www.cnblogs.com/hhhhuaz/p/17578380.html

相关文章

  • 矩阵乘法指数的基域不变性
    昨天意识模糊的时候突然想到了这个东西如何证明,重新发明了一遍.对于域\(F\),我们记\(\omega(F)\)为在域\(F\)上的矩阵乘法的张量秩给出的\[\omega(F)=\inf_{n}\frac{\logR(\langlen,n,n\rangle)}{\logn},\]我们知道,对于无限域\(F\)来说,这本质刻画了矩阵乘......
  • python取矩阵的最后一行
    Python取矩阵的最后一行在Python中,矩阵是一个二维数组,由行和列组成。当我们需要访问矩阵的特定行时,可以使用索引来定位。本文将介绍如何使用Python中的代码来获取矩阵的最后一行。什么是矩阵?矩阵是数学中的一个重要概念,它是由行和列组成的矩形阵列。在计算机编程中,矩阵可以用二......
  • 矩阵快速幂
    矩阵乘法限制条件:\(A\)的列数等于\(B\)的行数方法:\[A\timesB=C\RightarrowC_{i,j}=\sum_{k=1}^{r}A_{i,k}\timesB_{k,j}\]举个栗子:\[\begin{bmatrix}1&2\end{bmatrix}\times\begin{bmatrix}3\\4\end{bmatrix}=\begin{bmatrix}11\end{bmatri......
  • matlab郭彦甫02基本操作与矩阵输入
    1.变量不声明    变量只能由数字 字母 _  组成        且不能以数字开头2.保留关键字  ans  运算结果 i  j  复数 inf  无穷∞eps  浮点相对精度  很小的数值NaN  非数字pi  圆周率iskeyword  查看matla......
  • Vue3 响应式全局对象json 动态绑定界面二 (方块矩阵样式)
    效果main.js//全局对象constglobalData=reactive({extTelMonitorData:[{title:'用户组一',list:[{groupID:"0",groupName:"AllUsers",......
  • 矩阵求导攻略
    矩阵求导攻略定义与记号求导方法定义法求导逐分量求导矩阵微分求导矩阵微分求导......
  • C++数值计算——矩阵类的实现(一)
    本系列博客将利用C++实现一系列数值算法。数值算法离不开矩阵,但是C++并未自带矩阵这一对象,直接使用数组又会带来诸多不便,因此我们需要做一些预备工作————编写一个矩阵类,实现矩阵的基本功能。一般来说,读者可以直接使用Eigen库进行矩阵计算,从头开始造轮子仅仅是为了满足笔者个人......
  • Android opencv Mat 创建单位矩阵
    AndroidOpenCVMat创建单位矩阵在计算机视觉和图像处理中,矩阵是一个非常重要的概念。矩阵可以表示图像的像素值、进行图像变换、计算特征向量和特征值等。Android平台上,OpenCV是一个强大的图像处理库,提供了许多矩阵操作的函数和工具。本文将介绍如何使用OpenCV在Android上创建单......
  • 题解 //「BZOJ2406」矩阵
    赛时公告现在呢?:现在有弹窗了吗「2023-07-1916:45:07」此时无声胜有声。F.「BZOJ2406」矩阵http://222.180.160.110:1024/contest/3825/problem/7这是头一次见识到把矩阵和网络流结合在一起的题目。不过这种处理方式也是我们在学习二分图时的常客了:把行和列连边表示某一元......
  • 浅谈关系矩阵
    浅谈关系矩阵什么是关系矩阵关系矩阵就是用矩阵来表示关系,关系矩阵中的数值皆为**0**或**1**(也就是**bool**型)。举个例子:\[\begin{vmatrix}1&0&1\\0&0&1\\1&0&0\end{vmatrix}\]这个关系矩阵就表示了3个抽象物体的关系:\[\begin{vmatrix}1->1......