• 《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)
    ", i, j);
    59         }
    60         for (i = 0; i < n; ++i) {
    61             v[i].clear();
    62         }
    63         v.clear();
    64     }
    65     
    66     return 0;
    67 }
  • 相关阅读:
    Linux 显示当前时间
    Jenkins 更改工作目录;
    Jenkins 编译 .net 项目
    Jenkins 通过 maven 构建编译 JAVA 项目环境
    Jenkins
    Zatree
    Zabbix 邮件报警示例
    Zabbix 短信报警示例
    Linux 检测出口IP地址
    数据结构与算法面试题80道(4)
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3616807.html
Copyright © 2020-2023  润新知