2014-03-21 21:50
题目:给定一个MxN的二位数组,如果每一行每一列都是升序排列(不代表全展开成一个一维数组仍是升序排列的)。请设计一个算法在其中查找元素。
解法:对于这么一个数组,有两点是确定的:1. 左上最小,右下最大;2. 左边不大于右边,上边不大于下边。根据这么个思路,你可以从左下或者右上开始查找,应该向左走向右走,还是向上走向下走,你懂的。用这种方法,可以在线性的时间内找出一个元素。
代码:
1 // 11.6 Given an MxN matrix, each row and each column is sorted in ascending order. 2 // For emxample, 3 // [10 19] 4 // [15 21] 5 // It doesn't mean you can expand it to a one dimensional array and still sorted. 6 #include <cstdio> 7 #include <vector> 8 using namespace std; 9 10 void searchMatrix(vector<vector<int> > &v, int target, int &rx, int &ry) 11 { 12 int n, m; 13 14 rx = ry = -1; 15 n = (int)v.size(); 16 if (n == 0) { 17 return; 18 } 19 m = (int)v[0].size(); 20 21 int i, j; 22 23 i = 0; 24 j = m - 1; 25 while (i <= n - 1 && j >= 0) { 26 if (target > v[i][j]) { 27 ++i; 28 } else if (target < v[i][j]) { 29 --j; 30 } else { 31 rx = i; 32 ry = j; 33 return; 34 } 35 } 36 return; 37 } 38 39 int main() 40 { 41 vector<vector<int> > v; 42 int n, m; 43 int i, j; 44 int target; 45 46 while (scanf("%d%d", &n, &m) == 2 && n > 0 && m > 0) { 47 v.resize(n); 48 for (i = 0; i < n; ++i) { 49 v[i].resize(m); 50 } 51 for (i = 0; i < n; ++i) { 52 for (j = 0; j < m; ++j) { 53 scanf("%d", &v[i][j]); 54 } 55 } 56 while (scanf("%d", &target) == 1) { 57 searchMatrix(v, target, i, j); 58 printf("(%d, %d)\n", i, j); 59 } 60 for (i = 0; i < n; ++i) { 61 v[i].clear(); 62 } 63 v.clear(); 64 } 65 66 return 0; 67 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)