博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 240. 搜索二维矩阵 II (C#实现)——二分查找,分治法
阅读量:5282 次
发布时间:2019-06-14

本文共 2020 字,大约阅读时间需要 6 分钟。

问题:

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:    每行的元素从左到右升序排列。    每列的元素从上到下升序排列。示例:现有矩阵 matrix 如下:[  [1,   4,  7, 11, 15],  [2,   5,  8, 12, 19],  [3,   6,  9, 16, 22],  [10, 13, 14, 17, 24],  [18, 21, 23, 26, 30]]给定 target = 5,返回 true。给定 target = 20,返回 false。

GitHub实现:

思路:二分查找,分治法

参考:

一、二分查找

遍历矩阵中的每一行

对于第i行,初始left和right分别是数组的第一个和最后一个元素的下标,middle=(left+right)/2。

    如果matrix[i][middle] = target,则找到
    如果matrix[i][middle] < target,说明target不可能存在于数组的左半边,left = middle + 1
    如果matrix[i][middle] > target,说明target不可能存在于数组的右半边,right = middle - 1

完成遍历后都没有找到,则说明矩阵中没有要寻找的目标

//二分查找         public bool SearchMatrix(int[,] matrix, int target)        {            if (matrix.Length == 0) return false;            //行            var m = matrix.GetLength(0);            //列            var n = matrix.GetLength(1);            for (int i = 0; i < m; i++)            {                var left = 0;                var right = n - 1;                while (left <= right)                {                    var middle = (left + right) / 2;                    if (matrix[i, middle] == target) return true;                    if (matrix[i, middle] < target) left = middle + 1;                    else right = middle - 1;                }            }            return false;        }

二、分治法

右上角的元素是这一行中最大的元素,同时又是这一列中最小的元素。比较右上角元素和目标:

    若右上角元素等于目标,则找到
    若右上角元素大于目标,则目标不可能存在于当前矩阵的最后一列,问题规模可以减小为在去掉最后一列的子矩阵中寻找目标
    若右上角元素小于目标,则目标不可能存在于当前矩阵的第一行,问题规模可以减小为在去掉第一行的子矩阵中寻找目标

若最后矩阵减小为空,则说明不存在

//分治法         public bool SearchMatrix2(int[,] matrix, int target)        {            if (matrix.Length == 0) return false;            //行            var m = matrix.GetLength(0);            //列            var n = matrix.GetLength(1);            var i = 0;            var j = n - 1;            while (j >= 0 && i < m)            {                if (matrix[i, j] == target) return true;                if (matrix[i, j] > target) j--;                else i++;            }            return false;        }

 

转载于:https://www.cnblogs.com/zxxxx/p/10560340.html

你可能感兴趣的文章
【mongo】可以用localhost启动,无法用ip启动问题的解决
查看>>
【QT】视频播放
查看>>
HTML中使用javascript解除禁止input输入框代码:
查看>>
揭开Redis的神秘面纱
查看>>
Object流
查看>>
bzoj1293 [SCOI2009]生日礼物
查看>>
转 10 个 Nginx 的安全提示
查看>>
Windows Phone开发(8):关于导航的小技巧 转:http://blog.csdn.net/tcjiaan/article/details/7285062...
查看>>
React零碎知识点回顾
查看>>
字符串类型 字符串下标 字符串的方法 切片 for循环的一些总结
查看>>
Ajax学习笔记1之第一个Ajax应用程序
查看>>
数据库查询问题小记
查看>>
validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符...
查看>>
css3新单位vw、vh、vmin、vmax的使用详解(转载)
查看>>
软件测试培训第30天
查看>>
创建守护进程步骤与setsid()
查看>>
[iOS]Win8下iTunes无法连接iPhone版本的解决方法
查看>>
鸟哥私房菜基础篇:Linux 磁碟与档案系统管理习题
查看>>
垂直居中及水平垂直居中方案(共15种)
查看>>
JavaScript高级程序设计26.pdf
查看>>