经典面试题:有序矩阵的快速查找

【编者案】算法核心不在于框架用得有多熟练,更多在于逻辑和思维方式,很多情况都需要变换间接建模。本文将通过一个经典的面试题来描述思维过程,引导最终问题建模。


接着面试官要开始放大招了。


2.2逐行二分
一维的可以用二分快速查找,那就分解成一维,一行一行的用二分不就行了吗。














bool?solve1(vector<vector<int>>?&matrix,?ofstream?&cout,?int?x)?{
????int?i,?j;
????i?=?0;
????j?=?matrix[0].size()?-?1;
????bool?flag?=?false;
????while?(i?<?matrix[0].size()?&&?j?>=?0)?{
????????if?(matrix[i][j]?>?x)?{
????????????--j;
????????}?else?if?(matrix[i][j]?<?x)?{
????????????++i;
????????}?else?{
????????????return?true;
????????}
????}
????return?false;
}

按行二分,缩小列
int?searchColumn(vector<vector<int>>?&matrix,?int?up,?int?right,?int?x)?{
????int?i,?j,?mid;
????i?=?0;
????j?=?right;
????while?(i?<?j)?{
????????mid?=?(i?+?j)?/?2;
????????if?(x?<?matrix[up][mid])?{
????????????j?=?mid?-?1;
????????}?else?if?(x?>?matrix[up][mid])?{
????????????i?=?mid?+?1;
????????}?else?{
????????????i?=?j?=?mid;
????????}
????}
????if?(matrix[up][i]?>?x)?--i;
????return?i;
}
int?searchRow(vector<vector<int>>?&matrix,?int?up,?int?right,?int?x)?{
????int?i,?j,?mid;
????i?=?up;
????j?=?matrix.size()?-?1;
????while?(i?<?j)?{
????????mid?=?(i?+?j)?/?2;
????????if?(x?<?matrix[mid][right])?{
????????????j?=?mid?-?1;
????????}?else?if?(x?>?matrix[mid][right])?{
????????????i?=?mid?+?1;
????????}?else?{
????????????i?=?j?=?mid;
????????}
????}
????if?(matrix[i][right]?<?x)?++i;
????return?i;
}
bool?solve2(vector<vector<int>>?&matrix,?ofstream?&cout,?int?x)?{
????int?up,?right;
????up?=?0;
????right?=?matrix[0].size()?-?1;
????while?(!(up?==?matrix.size()?||?right?<?0))?{
????????right?=?searchColumn(matrix,?up,?right,?x);
????????if?(right?<?0)?continue;
????????up?=?searchRow(matrix,?up,?right,?x);
????????if?(up?==?matrix.size())continue;
????????if?(matrix[up][right]?==?x)?{
????????????return?true;
????????}
????}
????return?false;
}

void?dataInit()?{
????ofstream?cout("a.in");
????int?s?=?0;
????for?(int?i?=?0;?i?<?5000;?++i)?{
????????for?(int?j?=?0;?j?<?5000;?++j)?{
????????????cout?<<?s?+?i?+?j?<<?"?";
????????}
????????s?+=?4999;
????????cout?<<?endl;
????}
}
目标数:10002500
线性执行效率:
row=2000,?column=2500
T1=288
二分执行效率
row=2000,?column=2500
T2=10

?C 和 C++ 不安全?Android 支持 Rust 开发操作系统
?16岁的雅虎问答,因“不再受欢迎”将永久关闭
?滴滴、小米启动造车,特斯拉的护城河还能守多久?
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 习近平将发表二〇二六年新年贺词 7904141
- 2 2026年国补政策来了 7808738
- 3 东部战区:开火!开火!全部命中! 7712893
- 4 2026年这些民生政策将惠及百姓 7616985
- 5 小学食堂米线过期2.5小时被罚5万 7519709
- 6 解放军喊话驱离台军 原声曝光 7428214
- 7 为博流量直播踩烈士陵墓?绝不姑息 7327605
- 8 每月最高800元!多地发放养老消费券 7238391
- 9 数字人民币升级 1月1日起将计付利息 7141831
- 10 2026年1月1日起 一批新规将施行 7040675











CSDN
