• 【算法编程 C++ Python】二维数组查找


    题目:

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

    思路:

    最简单:每一行都使用二分法查找一遍。

    更省时间:

    二维数组从左到右从上到下递增。
    从最后一行找到刚好比target大的位置x,则上一行小于x的角标对应的数均小于target,
    移到上一行,在角标x到行末重复上一操作,
    以此类推,
    每上移一行所需要比较的数字越来越少。
    在上述过程中若无法找到相等的数字则不存在。
    在每一行找与target接近的数字的过程可以使用二分法,复杂度nlog(n)。

     C++:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class Solution {
    public:
        bool Find(int target, vector<vector<int>> array) {
            int col = array[0].size() - 1;
            int low = 0, high = col;
            int row = array.size()-1;
            for (int i = row; i >= 0; i--) {
                while (low <= high) {
                    int media = (low + high) / 2;
                    if (target < array[i][media]) {
                        high = media - 1;
                    }
                    else if (target > array[i][media]) {
                        low = media + 1;
                    }
                    else {
                        return true;
                    }
                }
                //low = 0; 若保留则为每一行均使用简单粗暴的二分法
                high = col;
            }
            return false;
        }
    };
    
    
    int main()
    {
        Solution obj;
        int target = 7;
        vector<vector<int>> arr = { {1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15} };
        cout << obj.Find(target, arr) << endl;
        cin.get();
        cin.get();
        return 0;
    }

     Python:

    # -*- coding:utf-8 -*-
    class Solution:
        def Find(self, target, array):
            row = len(array)-1
            col = len(array[0])-1
            low = 0
            high = col
            for i in xrange(row,-1,-1): # 倒序
                while low<=high:
                    media = (low+high)/2
                    if target<array[i][media]:
                        high = media-1
                    elif target>array[i][media]:
                        low = media+1
                    else:
                        return True
                #low = 0 若保留则为吗,每一行均使用二分法直接查找
                high = col
            return False
            
            
    if __name__ == '__main__':
        target = 7
        array = [[1, 2, 8, 9], [2, 4, 9, 12], [4, 7, 10, 13], [6, 8, 11, 15]] 
        obj = Solution()
        print obj.Find(target, array)

    上述代码在牛客网测试,用时和空间占用分别为:

    C++:9ms,1372k

    Python:300ms,5860k

  • 相关阅读:
    cef加载flash的办法
    一个高性能的对象属性复制类,支持不同类型对象间复制,支持Nullable<T>类型属性
    php检测php.ini是否配制正确
    openwrt的路由器重置root密码
    windows 7 + vs2010 sp1编译 x64位版qt4
    解决SourceGrid在某些系统上无法用鼠标滚轮滚动的问题
    判断一个点是否在多边形内部,射线法思路,C#实现
    [转载]使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理
    让Dapper+SqlCE支持ntext数据类型和超过4000字符的存储
    通过WMI
  • 原文地址:https://www.cnblogs.com/xiangfeidemengzhu/p/8894181.html
Copyright © 2020-2023  润新知