随笔- 509  文章- 0  评论- 151  阅读- 22万 

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 }
复制代码

 

 posted on   zhuli19901106  阅读(205)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示