题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如:下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字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二维数组中的查找的更多相关文章

  1. 剑指offer:二维数组中的查找

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺 ...

  2. 剑指 Offer 04. 二维数组中的查找 (思维)

    剑指 Offer 04. 二维数组中的查找 题目链接 本题的解法是从矩阵的右上角开始寻找目标值. 根据矩阵的元素分布特性, 当目标值大于当前位置的值时将row行号++,因为此时目标值一定位于当前行的下 ...

  3. 《剑指offer》 二维数组中的查找

    本题目是<剑指offer>中的题目 二维数组中的查找 题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...

  4. 【Java】 剑指offer(3) 二维数组中的查找

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上 ...

  5. [剑指Offer]5.二维数组中的查找

    题目 在一个二维数组中,每一行都依照从左到右递增的顺序排序,每一列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个二维数组和一个整数.推断数组中是否含有该整数. 思路 [算法系列之三十三]杨 ...

  6. 《剑指Offer 1.二维数组中的查找》2019-03-25

    剑指Offer  第一题 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数 ...

  7. Go语言实现:【剑指offer】二维数组中的查找

    该题目来源于牛客网<剑指offer>专题. 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一 ...

  8. 【剑指offer】二维数组中的查找

    题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.   注意点:要注意特殊 ...

  9. 剑指Offer 1. 二维数组中的查找 (数组)

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

  10. 剑指offer(2) - 二维数组中的查找

    题目: 在一个二维数组中.每一行都依照从左到右递增的顺序排序,每一列都依照从上往下递增的顺序排序.请写一个函数,输入一个二维数组和一个整数,推断数组中是否含有该整数. 比如以下的二维数组就是每行.每列 ...

随机推荐

  1. OpenCV图像修复

    在OpenCV的"photo.hpp"中定义了一个inpaint函数,可以用来实现图像的修复和复原功能,inpaint函数的原型如下: void inpaint( InputArr ...

  2. OpenGl(二)点线设置、多边形镂空

    1. 改变点的大小 OpenGL中默认点的大小是1个像素,使用函数glPointSIze可以调整点的大小,入参是GLfloat,相当于是浮点数. 相关代码: void myDisplay(void) ...

  3. 转:PyQt4学习资料汇总 from coderzh

    一个月前研究了下PyQt4,感觉比较不错.相比wxpython,界面美观了很多,并且将界面设计与代码逻辑很好的分离了开来.关于PyQt4的资料也不少,这里我将我找到的资料汇总一下,以防自己以后忘得一干 ...

  4. Oracle使用dblink连接SqlServer

    使用场景:当你需要从ORACLE数据库上访问另一台SqlServer数据库的数据时,Oracle提供了一个工具:gateways.通过这个工具,你可以创建dblink来连接sqlserver或其他不同 ...

  5. 构建自己的PHP框架(邮件发送)

    完整项目地址:https://github.com/Evai/Aier 我们采用 'nette/mail' 包作为我们的邮件发送基础模块,在它的基础上封装一个 'Mail' 类,暴露出简洁的 API ...

  6. iOS-让button按钮显示成圆角

    这里用到的属性layer是CALayer类型,属于UIView,也就是说所有UIView的子类都能使用这个属性. @property (strong, nonatomic) IBOutlet UIBu ...

  7. intel dpdk IPv4 Fragmentation Sample Application 测试

    在上一篇文章中testpmd根据该方案已经在的情况下试验成功,来examples/ipvr_frag夹. 确认环境变量RTE_SDK.RTE_TARGET行.跑make. 一.一个逻辑核(lcore) ...

  8. .net core 2.0 读取配置文件

    1.引用Microsoft.Extensions.Configuration2.在Startup中注入服务 public static IConfiguration Configuration { g ...

  9. WPF 4 动态覆盖图标(Dynamic Overlay Icon)

    原文:WPF 4 动态覆盖图标(Dynamic Overlay Icon)      在<WPF 4 开发Windows 7 任务栏>一文中我们学习了任务栏的相关开发内容,同时也对覆盖图标 ...

  10. WPF控件TextBlock中文字自动换行

    原文:WPF控件TextBlock中文字自动换行 在很多的WPF项目中,往往为了追求界面的美观,需要控制控件中文字的换行显示,现对TextBlock控件换行的实现方式进行总结,希望大家多多拍砖!!! ...