zoukankan      html  css  js  c++  java
  • 【剑指Offer】面试招聘题目1:二维数组中的查找

    题目链接:http://ac.jobdu.com/problem.php?cid=1039&pid=0

    题目描述:

    题目描述: 
    在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
    
    输入: 
    输入可能包含多个测试样例,对于每个测试案例,
    输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。
    输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字。
    接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
    
    输出: 
    对应每个测试案例,
    输出”Yes”代表在二维数组中找到了数字t。
    输出”No”代表在二维数组中没有找到数字t。
    
    样例输入: 
    3 3
    5
    1 2 3
    4 5 6
    7 8 9
    3 3
    1
    2 3 4
    5 6 7
    8 9 10
    3 3
    12
    2 3 4
    5 6 7
    8 9 10
    样例输出: 
    Yes
    No
    No

    Java代码,测试通过,但是OJ测试Runtime Error

    import java.util.Scanner;
    
    /**
     * 题目一:二维数组中的查找
     * Runtime Error
     * @author yinger
     */
    
    public class NineOj_t1 {
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int m, n, key;// m行 n列 key要查找的数字
            while (scanner.hasNext()) {
                m = scanner.nextInt();
                n = scanner.nextInt();
                key = scanner.nextInt();
                int[][] data = new int[m][n];
                for (int i = 0; i < m; i++) {// 给数组赋值
                    for (int j = 0; j < n; j++) {
                        data[i][j] = scanner.nextInt();
                    }
                }
                search(data, m, n, key);
            }
        }
    
        // 从二维数组data[m][n]中找key
        private static void search(int[][] data, int m, int n, int key) {
            int[] line = new int[n];
            for (int i = 0; i < n; i++) {// 一维数组line保存data的对角线
                line[i] = data[i][i];
            }
            boolean flag = false;// 标识是否找到
            int low = 0, high = n - 1, mid;
            while (low <= high) {// 折半查找
                mid = (low + high) / 2;
                if (line[mid] == key) {
                    flag = true;
                    break;
                } else if (line[mid] > key) {
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }
            // line[low] data[low][low-1] data[low-1][low]
            if (!flag && low - 1 >= 0) {
                if ((low < m && data[low][low - 1] == key) || (low < n && data[low - 1][low] == key)) {
                    flag = true;
                }
            }
            if (flag) {
                System.out.println("Yes");
            } else {
                System.out.println("No");
            }
        }
    
    }
  • 相关阅读:
    设计模式-1.12备忘录模式
    设计模式-简介
    设计模式-1.9享元模式
    设计模式-1.8组合模式
    设计模式-1.7外观模式
    设计模式-1.6建造者模式(生成器模式)
    设计模式-1.5原型模式
    我在GitHubPage的博客
    奇怪的友链增加啦!
    SSL-OI夏日合宿 杂题 LOJ#6089小Y的背包计数问题 根号分治
  • 原文地址:https://www.cnblogs.com/yinger/p/2690801.html
Copyright © 2011-2022 走看看