《Cracking the Coding Interview》——第11章:排序和搜索——题目6

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 }

 

转载于:https://www.cnblogs.com/zhuli19901106/p/3616807.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cracking the coding interview epub 6th》是一本非常知名的程序员面试指南,由Gayle Laakmann McDowell撰写。本书重点介绍了在技术面试中常见的编码问题,旨在帮助读者提高他们的编码和解决问题的能力。 这本书的第六版是根据最新的职业面试趋势进行更新的,它包含了一系列经典的算法和数据结构问题,并提供了解决方法和详细的解释。它还提供了大量的面试经验和技巧,帮助读者在面试中更好地展示自己的技术能力。 书中的节主要包括了面试准备和面试过程中的一些最佳实践。其中,准备节主要介绍了如何优化简历、建立自己的在线个人品牌以及构建技术项目,以使自己在面试中更加具有竞争力。而面试节则着重回答了一些经典的编码问题,包括字符串、数组、链表、树和图等等。每个问题都提供了多种解决方法,并讨论了每种方法的优劣和复杂度。 此外,书中还包含了面试问题的答案和解析,以及面试中常见的陷阱和注意事项。这些帮助读者更好地理解和准备面试问题,提供了一个全面的面试准备指南。 总之,《cracking the coding interview epub 6th》是一本非常值得推荐的面试准备指南,适用于任何有意向从事编码工作的人。无论是初学者还是有经验的程序员,都可以从中学习到宝贵的经验和技巧,提升他们在技术面试中的成功率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值