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

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


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


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 从五年规划看“中国之治” 7904405
- 2 中俄轰炸机航母3个方向“包围琉球” 7809407
- 3 为一棵树拨打12345 引百万网友围观 7714494
- 4 长征系列火箭一日三发 7616717
- 5 崖洞发现干尸博主称已找到逝者家属 7521845
- 6 女子花2500元买的羽绒服袖子缝反了 7424697
- 7 央视马年春晚官宣 7334245
- 8 中俄联合巡航引日方担忧 国防部回应 7235017
- 9 无人机在崖洞发现干尸 警方通报 7142351
- 10 冷空气南下 这些地方流感风险上升 7044753










CSDN
