JAVA找出宽度最小子矩阵_AcWing 1452. 寻找矩阵的极小值-Java

该解决方案通过二分查找找到宽度最小子矩阵。首先找到中间列的最小值,然后根据边界条件更新搜索范围。最后,找到最后一列的最小值并返回结果。
摘要由CSDN通过智能技术生成

// The query API is defined in the parent class Getvalue:

// int query(int x, int y);

// return int means matrix[x][y].

class Solution extends Getvalue {

public int[] getMinimumValue(int n) {

int lo = 0, hi = n-1;

while (lo < hi) {

int mid = lo + (hi - lo >> 1); // 注意这里,不要写成 lo + (hi - lo) >> 1,>>的优先级低

// 找到中间一列的最小值

int min = Integer.MAX_VALUE;

int minIndex = -1; // 行的索引

for (int i = 0; i < n; i++) {

int temp = query(i, mid);

if (min > temp) {

min = temp;

minIndex = i;

}

}

// mid+1 一定存在,因为 mid 最大为 n-2, 但 mid-1 不一定存在,因为 mid 最小可以为0

if (mid <= 0) {

lo = mid + 1;

} else if (query(minIndex, mid-1) > min && query(minIndex, mid+1) > min) {

return new int[]{minIndex, mid};

}

if (query(minIndex, mid-1) < min) {

hi = mid - 1;

} else {

lo = mid + 1;

}

}

// 找到最后一列(lo == hi)的最小值

int min = Integer.MAX_VALUE;

int minIndex = -1;

for (int i = 0; i < n; i++) {

int temp = query(i, lo); // 这里用 lo 和 hi 一样

if (min > temp) {

min = temp;

minIndex = i;

}

}

return new int[]{minIndex, lo};

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值