zoukankan      html  css  js  c++  java
  • 剑指Offer03-二维数组中的查找

    题目:

    /**
    
         * 在一个二维数组中,每一行都按照从左到右递增
    
         * 的顺序排序,每一列都按照从上到下递增的顺序排序。
    
         * 请完成一个函数,输入这样的一个二维数组
    
         * 和一个整数,判断数组中是否函数该整数。
    
         */

    解题思路:

    查找的本质就是先指定一个初始值,把初始值与要查找的数进行比较,如果两个数相等,就返回true,否则初始值发生变化,继续与要查找的值进行比较,直到找到或找不到;

    在本题中的二维数组中,数字的排序遵循从左向右增加,从上往下增加的规律,问题的关键在于如何选取适当的初始值,来简化查找的过程;

    简化查找的过程在于如何缩小数组中的范围,左上角和右下角分别对应数组中的最小值和最大值,如果以两者中的其中之一为初始值的话,初始值都能够朝着两个方向发生变化

    无法缩小查找的范围(比如:以左上角的值为初始值,如果要查找的值比初始值大,那么下一个初始值的选取是在第一行或者第一列,没法做到缩小查找范围的作用。右下角同理)

    若选取右上角和左下角的值为初始值,比如右上角的值为初始值,若要查找的值小于初始值,则可以排除右上角所在的列,若要查找的值大于初始值,则可以排除右上角所在的行。

    以此类推,直到找到要查找的值或找不到返回false,左下角的值同理。

    代码如下:

    public class ArraySerach {
        public static void main(String[] args) {
            int[][] arr = {    {1,2,8,9},
                             {2,4,9,12},
                             {4,7,10,13},
                             {6,8,11,15}};
            System.out.println(search(arr,7));
        }
        
        private static boolean search(int[][] arr,int value) {
            int a = arr[0].length;
            int b = arr.length;
            int i = 0;
            int j = a-1;
            while(i<=b-1 && j>=0) {
                if(arr[i][j] == value) {
                    return true;
                }
                if(arr[i][j] > value) {
                    j--;
                }else {
                    i++;
                }
            }
            return false;
        }
    }    
  • 相关阅读:
    Python 进度条
    python多线程的使用
    Python 进程间通信问题—Manager方法
    生产消费者模型(进程通信,队列)
    进程锁 购票问题
    多进程并行实现socket并发代码
    一次完整的socket文件的传输
    python实现基本计算器(可处理括号和负值)
    模拟论坛登录
    JS
  • 原文地址:https://www.cnblogs.com/meteorst/p/9220495.html
Copyright © 2011-2022 走看看