C#版剑指Offer-001二维数组中的查找
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如:下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。
解题思路
看到该题目想到的最简单暴力做的做法就是直接遍历数组查找。但是实际上一般都要用效率更高的做法,该题目有两个重要条件,从左到右递增,从上到下递增,也就是说每一个数都比前一个大比后一个小,比上面的大比下面的小。由此想到可以右上角或者左下角开始处理,这样每次处理都会剔除一行或者一列,逐渐缩小范围,直到找到要查找的数字或者没有。
代码实现
/// <summary>
/// 检测是否在数组范围内
/// </summary>
/// <param name="array"></param>
/// <param name="target"></param>
/// <returns></returns>
private static bool CheckIsArrayRange(int[,] array, int target)
{
bool result = false;
if (array != null && array.Rank == )
{
int rowLength = array.GetLength();
int colLength = array.GetLength();
int start = array[, ];
int end = array[rowLength - , colLength - ];
if (start <= target && target <= end)
{
result = true;
}
}
return result;
} /// <summary>
/// 暴力解法-直接遍历
/// </summary>
/// <param name="array">数组</param>
/// <param name="target">目标</param>
/// <returns></returns>
private static bool FindForSimple(int[,] array, int target)
{
bool result = false;
if (CheckIsArrayRange(array, target))
{
foreach (var item in array)
{
if (target == item)
{
result = true;
break;
}
}
}
return result;
} /// <summary>
/// 右上角解题
/// </summary>
/// <param name="array"></param>
/// <param name="target"></param>
/// <returns></returns>
private static bool FindForRight(int[,] array, int target)
{
bool result = false; if (CheckIsArrayRange(array, target))
{
int rowLength = array.GetLength();
int colLength = array.GetLength(); int row = , col = colLength - ;//坐标右上角
while (row < rowLength && col >= )
{
if (array[row, col] == target)
{
result = true;
break;
}
else if (array[row, col] > target)
{
col--;
}
else
{
row++;
}
}
} return result;
}
想入非非:扩展思维,发挥想象
目的:
1. 熟悉二维数组
2. 不要动不动就循环,多想想
扩展:
1. 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增n的顺序排序,每一列都按照从上到下递增n的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:从左到右递增n,从上到下递增n,这属于等比递增数组(自己起的),这样的如果还用右上角的做法,那效率不是很高,正确的做法是用等比数列计算求值的方法。(target-start)/n,如果可以整除,那么这个数据就存在,不能整除就不存在。
代码实现
/// <summary>
/// 等比数列的数组
/// </summary>
/// <param name="array"></param>
/// <param name="target"></param>
/// <returns></returns>
private static bool FindForN(int[,] array, int target)
{
bool result = false;
if (CheckIsArrayRange(array, target))
{
int rowLength = array.GetLength();
int colLength = array.GetLength();
int first = array[, ];
int second = ; if (rowLength > ) { second = array[, ]; }
else if (colLength > ) { second = array[, ]; }
else { second = target; } int n = second - first;
if (n == )
{
if (first == target)
{
result = true;
}
}
else
{
int remainder = (target - first) % n;
if (remainder == )
{
result = true;
}
}
} return result;
}
2. 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数,有返回数据的坐标
解题思路:按照右上角的解题思路,把坐标记录放到list中就可以了。
测试
[Fact]
public void Test1()
{
int[,] array = { { , , , }, { , , , }, { , , , }, { , , , } };
int target = ;
Assert.True(Coding001.FindForSimple(array, target));
Assert.True(Coding001.FindForRight(array, target));
} [Fact]
public void Test3()
{
int[,] array = { { , , , }, { , , , }, { , , , }, { , , , } };
int target = ;
Assert.False(Coding001.FindForSimple(array, target));
Assert.False(Coding001.FindForRight(array, target));
} [Fact]
public void MinTest()
{
int[,] array = { { , , , }, { , , , }, { , , , }, { , , , } };
int target = ;
Assert.False(Coding001.FindForSimple(array, target));
Assert.False(Coding001.FindForRight(array, target));
} [Fact]
public void MaxText()
{
int[,] array = { { , , , }, { , , , }, { , , , }, { , , , } };
int target = ;
Assert.False(Coding001.FindForSimple(array, target));
Assert.False(Coding001.FindForRight(array, target));
} [Fact]
public void Test5()
{
int[,] array = { { , , , }, { , , , }, { , , , } };
int target = ;
Assert.True(Coding001.FindForSimple(array, target));
Assert.True(Coding001.FindForRight(array, target));
Assert.True(Coding001.FindForN(array, target));
} [Fact]
public void Test6()
{
int[,] array = { { , , , }, { , , , }, { , , , } };
int target = ;
Assert.False(Coding001.FindForSimple(array, target));
Assert.False(Coding001.FindForRight(array, target));
Assert.False(Coding001.FindForN(array, target));
} [Fact]
public void Test7()
{
int[,] array = { { , , , }, { , , , }, { , , , } };
int target = ;
Assert.True(Coding001.FindForSimple(array, target));
Assert.True(Coding001.FindForRight(array, target));
Assert.True(Coding001.FindForN(array, target));
} [Fact]
public void Test8()
{
int[,] array = { { , , , }, { , , , }, { , , , } };
int target = ;
Assert.False(Coding001.FindForSimple(array, target));
Assert.False(Coding001.FindForRight(array, target));
Assert.False(Coding001.FindForN(array, target));
}
结果

C#版剑指Offer-001二维数组中的查找的更多相关文章
- 剑指offer:二维数组中的查找
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺 ...
- 剑指 Offer 04. 二维数组中的查找 (思维)
剑指 Offer 04. 二维数组中的查找 题目链接 本题的解法是从矩阵的右上角开始寻找目标值. 根据矩阵的元素分布特性, 当目标值大于当前位置的值时将row行号++,因为此时目标值一定位于当前行的下 ...
- 《剑指offer》 二维数组中的查找
本题目是<剑指offer>中的题目 二维数组中的查找 题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...
- 【Java】 剑指offer(3) 二维数组中的查找
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上 ...
- [剑指Offer]5.二维数组中的查找
题目 在一个二维数组中,每一行都依照从左到右递增的顺序排序,每一列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个二维数组和一个整数.推断数组中是否含有该整数. 思路 [算法系列之三十三]杨 ...
- 《剑指Offer 1.二维数组中的查找》2019-03-25
剑指Offer 第一题 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数 ...
- Go语言实现:【剑指offer】二维数组中的查找
该题目来源于牛客网<剑指offer>专题. 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一 ...
- 【剑指offer】二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 注意点:要注意特殊 ...
- 剑指Offer 1. 二维数组中的查找 (数组)
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- 剑指offer(2) - 二维数组中的查找
题目: 在一个二维数组中.每一行都依照从左到右递增的顺序排序,每一列都依照从上往下递增的顺序排序.请写一个函数,输入一个二维数组和一个整数,推断数组中是否含有该整数. 比如以下的二维数组就是每行.每列 ...
随机推荐
- WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口)
原文 WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口) WPF 的 UI 逻辑只在同一个线程中,这是学习 WPF 开发中大家几乎都会学习到的经验.如果希望做不同线程 ...
- SharePoint Iframe 一个错误此内容不能显示在一帧<继续>
在之前的SharePoint网站iframe引用中,我们遇到过以下的问题,就是其他系统或者不通环境的SharePoint网站,引用SharePoint页面会报错"此内容不能显示在一个框架中& ...
- WPF旋转的界面实现
原文:WPF旋转的界面实现 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/article/details/1821534 ...
- windows下编译qt的mysql驱动
windows下编译qt的mysql驱动cd %QTDIR%\src\plugins\sqldrivers\mysqlqmake –o Makefile INCLUDEPATH+="C:\M ...
- OpenGL(十五) OpenCV+OpenGL实现水面倒影
有两幅原始图片,一个是景物图像,一个是水面图像,尝试生成景物在水中的倒影: 在OpenGL中,加载并显示这个景物图像可以把这个图像作为纹理载入即可,把图像直接选择180度的效果就相当于是在镜面中倒影的 ...
- sql server 2016 JSON 学习笔记
虽然现在win服务器已经几乎不用了,但是网上看到2016开始原生支持json 还是想试试 建立一个表 id int , json varchar(2000) json字段中输入数据 {"r ...
- 区别JS和DOM对象
<div> <button id="bt" onclick="ChangeColor()">Clike To Change Color& ...
- Android零基础入门第9节:Android应用实战,不懂代码也可以开发
原文:Android零基础入门第9节:Android应用实战,不懂代码也可以开发 通过上一期的学习,我们成功开发了Android学习的第一个应用程序,不仅可以在Android模拟器上运行,同时还能在我 ...
- Docker笔记01-发布一个dotnetcore应用
OS:Widows 10 IDE: VS2017 Docker:Docker Desktop for Windows Windows下安装Docker需要先启用Hyper-v 在Windows 容器的 ...
- 中国自主X86处理器工艺跃进:国产28nm升级16nm(上海兆芯)
提到X86处理器,世人皆知Intel.AMD,殊不知还有个VIA(威盛),在Intel反垄断世纪大战中VIA公司作为Intel霸权的受害者也最终确认了X86授权,不过VIA与前面两家的实力相差太远,X ...