题目描述

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

    0. 多维数组的显示问题 >> X = np.reshape(np.arange(24), (2, 3, 4)) # 也即 2 行 3 列的 4 个平面(plane) >> X ...

  2. IEditableObject的一个通用实现

    原文:IEditableObject的一个通用实现 IeditableObject是一个通用接口,用于支持对象编辑.当我们在界面上选择一个条目,然后对其进行编辑的时候,接下来会有两种操作,一个是保持编 ...

  3. Leetcode 144 Binary Tree Preorder Traversal 二叉树

    二叉树的基础操作:二叉树的先序遍历(详细请看数据结构和算法,任意本书都有介绍),即根,左子树,右子树,实现方法中还有用栈实现的,这里不介绍了 /** * Definition for binary t ...

  4. Linux性能测试 netstat命令

    功能说明:Netstat用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.语 法:netstat [-acCeFghilMnNoprstuvVwx][- ...

  5. Cocos2d-x 3.1 一步一步地做改编

    本文并不想谈论的屏幕改编或真理的概念.假设不知道cocos2d-x的,请先看这篇文章:http://www.cocoachina.com/gamedev/cocos/2014/0516/8451.ht ...

  6. C# 用XiliumCefGlue做浏览器,JS和C#相互调用

    原文:C# 用XiliumCefGlue做浏览器,JS和C#相互调用 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013564470/artic ...

  7. POJ读书笔记2.1 —— 鸡兔笼带

    http://blog.csdn.net/pipisorry/article/details/36433305 问题描写叙述  一个笼子里面关了鸡和兔子(鸡有2仅仅脚.兔子有4仅仅脚.没有例外). 已 ...

  8. 你所不知道的 Kindle - 阅读微信公众号文章

    Kindle 是一款非常优秀的阅读设备,它为我们提供了非常舒服的阅读体验,并且配合强大的亚马逊图书资源,应该是目前最好的阅读设备之一.Kindle 在已有的成就下还一直在努力提升用户体验.为中国用户开 ...

  9. 1-9 RHEL7-文件权限管理

    本节所讲内容: 文件的基本权限:r w x (UGO+ACL) 文件的高级权限:suid sgid sticky 第1章 文件的基本权限 1.1 权限的作用 通过对文件设定权限可以达到以下三种访问限制 ...

  10. abp.message

    abp.message.success(app.localize('SomeMessage'), app.localize('Title')) .done(function() { //do some ...