zoukankan      html  css  js  c++  java
  • 剑指Offer-1.二维数组中的查找(C++/Java)

    题目:

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

    分析:

    判断二维数组中是否有给定元素,暴力解的话时间复杂度O(n^2),无法通过测试。

    所给的二维数组实际上是有序的,每一行从左至右是递增的,而每一列从上到下是递增的,利用这个特性我们可以更快速的求解此问题。

    我们可以从右上角的元素开始和所给的整数去比较,因为右上角的元素有这样一个特性,它左边的元素都比它小,而下面的元素都比它大,如果给定的整数比它大,意味着这一行的元素都比它小,也就不可能再有这个整数了,而给定的整数如果比它小,这一列的元素都比它大,也不会含有这个整数,我们每一次的比较,都可以排除一行,或一列元素,这样的效率是很高的。

    target = 11,二维数组如下:

    [1,3, 5,7]

    [10,11,16,20]

    [23,30,34,50]

    首先比较7 < 11,所以我们排除第一行,比较本列的下一个元素。

    [1,3, 5,7]

    [10,11,16,20]

    [23,30,34,50]

    因为20 > 11,所以我们排除这一列,比较本行的前一个元素。

    [1,3, 5,7]

    [10,11,1620]

    [23,30,34,50]

    同理,排除16所在的那列,继续比较本行的前一个元素。

    [1,3, 5,7]

    [10,1116,20]

    [23,30,34,50]

    最后找到11这个元素,返回true即可。时间复杂度是O(m+n),即二维数组的行列之和。

    程序:

    C++

    class Solution {
    public:
        bool Find(int target, vector<vector<int> > array) {
            if(array.empty()) return false;
            int m = array.size();
            int n = array[0].size();
            int x = 0;
            int y = n-1;
            while(x < m && y >= 0){
                if(array[x][y] > target){
                    y--;
                }
                else if(array[x][y] < target){
                    ++x;
                }
                else{
                    return true;
                }
            }
            return false;
        }
    };

    Java

    public class Solution {
        public boolean Find(int target, int [][] array) {
            if(array == null) return false;
            int m = array.length;
            int n = array[0].length;
            int x = 0;
            int y = n-1;
            while(x < m && y >= 0){
                if(array[x][y] > target){
                    --y;
                }
                else if(array[x][y] < target){
                    ++x;
                }
                else{
                    return true;
                }
            }
            return false;
        }
    }
  • 相关阅读:
    linux centos 7.5 开启 postgresql 远程访问
    linux centos 7 开启 ftp
    CentOS 7.5 改IP后不生效无法上网解决办法
    Windows Server 2008R2 及上系统安装 Windows 可选功能
    C#只允许运行一个实例
    C# 命令行参数分割
    C# 获取所有已登录系统的用户名
    C#获取进程用户名
    psexec 用法
    检测 Visual C++ Redistributable Package 相应版本是否已安装
  • 原文地址:https://www.cnblogs.com/silentteller/p/11762414.html
Copyright © 2011-2022 走看看