题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如:下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字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. 数学思想方法-python计算战(8)-机器视觉-二值化

    二值化 hreshold Applies a fixed-level threshold to each array element. C++: double threshold(InputArray ...

  2. 正确 C# 未来的期望

    接触 C# 一年.整体上是一个很完好的语言,可是某些细节特征还是不够完美.这里记下我如今对它将来的一些期望. 更强大的泛型约束 与 C++ 的模板相似,C# 的泛型使得编写适用于多种类型的代码更加简洁 ...

  3. python 教程 第十六章、 正则表达式

    第十六章. 正则表达式 1)    匹配多个表达式 记号  re1|re2 说明  匹配正则表达式re1或re2 举例  foo|bar  匹配  foo, bar 记号  {N} 说明  匹配前面出 ...

  4. rocksdb源码——性能诊断

    该文前三部份介绍 statistics.perf context和iostat context和thread status相关内容.最后介绍ThreadLocalPtr实现的原理. 0. 性能诊断类型 ...

  5. 解决ASP.NET中Redis 每小时6000次访问请求的问题

    原文:解决ASP.NET中Redis 每小时6000次访问请求的问题 虽然ServiceStack v4是商业支持的产品,但我们也允许免费使用小型项目和评估目的.上面的NuGet包中包含可以使用许可证 ...

  6. react项目实践——(4)依赖安装与配置

    1. 修改package.json,添加需要安装的包 { "name": "myapp", "version": "1.0.0&q ...

  7. 说谎的简单工厂模式设计模式&amp;工厂方法模式&amp;Abstract Factory模式

    工厂模式被分成三个:简单工厂模式,抽象工厂模式和工厂模式. 定义: 简单工厂模式:用一个单独的类来做创造实例的过程. 工厂模式:一个用于创建对象的接口.让子类决定实例化哪一个类,讲一个类的实例化 延迟 ...

  8. C++ 异常机制分析(C++标准库定义了12种异常,很多大公司的C++编码规范也是明确禁止使用异常的,如google、Qt)

    阅读目录 C++异常机制概述 throw 关键字 异常对象 catch 关键字 栈展开.RAII 异常机制与构造函数 异常机制与析构函数 noexcept修饰符与noexcept操作符 异常处理的性能 ...

  9. springboot 上传图片

    1. 创建多层目录 创建多层目录要使用File的mkdirs()方法,其他可以使用mkdir()方法. 2. 文件大小限制 配置文件中,在spring1.4以后要使用 ` spring.http.mu ...

  10. Xml格式的Bared和Warpped

    Bared   Wrapped