题目:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
//题目思考: 从哪里进行判断比较比较适合,经分析,左下角和右上角进行判断都是可行的办法.为什么不从左上角开始搜寻呢?因为左上角向右和向下都是递增,那么对于一个点,对于向右和向下会产生一个岔路;如果我们选择从左下脚开始搜寻的话,如果大于就向右,如果小于就向下,右上角同理.
class Solution
{
public bool Find(int[][] array, int target)
{
bool found = false;
int rows = array.GetLength(0); //获取行
int columns = array[0].Length; //获取列
if (array != null && rows > 0 && columns > 0)
{
int row = 0, column = columns - 1;
while (row < rows && column >= 0)
{
//首先进行比较右上角的数组
if (array[row][column] == target)
{
found = true;
break;
}
else if (array[row][column] > target)
--column;
else
++row;
}
}
return found;
}
}
顺便一说,C#中对于二维数组的定义,其实应该是string[,],而不是锯齿数组string[][] ( 俗称数组的数组)
锯齿数组和二维数组区别在于:
string[][] 是不规则的,可以理解成元素是 string[] 类型的一维数组(数组的数组)
string[,] 是规则的,可以理解是个矩阵,每个元素都是 string 类型
可以假设,在 JsSerializer 里面有一个方法用 foreach 遍历处理 IEnumerable 的成员,那么你可以试一下代码:
string[][] jagger;
string[,] matrix;
foreach (var item1 in jagger){}
foreach (var item2 in matrix){}
不用运行,用 VS 的智能提示看看两个 var 分别是什么类型,你会发现 item1 的类型是 string[],item2 的类型是 string,
这就可以理解 JsSerializer 处理 string[][] 和 string[,] 的行为了。
顺便一说c#锯齿数组的初始化
int[][] array = {
new int []{1,2,3},
new int []{2,5,6},
new int []{3,6,8},
new int []{5,8,10}
};
二维数组的初始化为:
string[,] arr = new string[,]
{
{ "0","0000","0000","0000"},
{ "1","0001","0001","0001"},
{ "2","0010","0010","0010"},
{ "3","0011","0011","0011"},
{ "4","0100","0100","0100"},
{ "5","0101","1011","1000"},
{"6","0110","1100","1001"},
{ "7","0111","1101","1010"},
{ "8","1000","1110","1011"},
{ "9","1001","1111","1100"}};
Console.WriteLine(arr[0,0]);
}