1

我最近遇到了这个问题,你必须从一个有序的二维数组中找到一个整数。但是这两个暗淡数组是按行而不是按列排序的。我已经解决了这个问题,但仍然认为可能有更好的方法。所以特地来这里和大家讨论一下。您的建议和改进将帮助我在编码方面成长。这是代码

int searchInteger = Int32.Parse(Console.ReadLine());
      int cnt = 0;
        for (int i = 0; i < x; i++)
        {
           if (intarry[i, 0] <= searchInteger && intarry[i,y-1] >= searchInteger)
           {
               if (intarry[i, 0] == searchInteger || intarry[i, y - 1] == searchInteger)
                  Console.WriteLine("string present {0} times" , ++cnt);
                  else
                  {
                      int[] array = new int[y];
                      int y1 = 0;
                      for (int k = 0; k < y; k++)
                      array[k] = intarry[i, y1++];
                      bool result;

                        if (result = binarySearch(array, searchInteger) == true)
                       {
                        Console.WriteLine("string present inside {0} times", ++ cnt);
                        Console.ReadLine();
                       }
                 }
           }

       }

其中 searchInteger 是我们必须在数组中找到的整数。并且二进制搜索是返回布尔值的方法,如果值存在于一维数组中(在该单行中)。

请帮忙,它是最佳的还是有比这更好的解决方案。

谢谢

4

1 回答 1

1

前提是您已经声明了数组intarry,如下所示:xy

int[,] intarry =
{
    {0,7,2},
    {3,4,5},
    {6,7,8}
};
var y = intarry.GetUpperBound(0)+1;
var x = intarry.GetUpperBound(1)+1; 
// intarry.Dump();

你可以保持简单:

int searchInteger = Int32.Parse(Console.ReadLine());

var cnt=0;
for(var r=0; r<y; r++)
{
    for(var c=0; c<x; c++)
    {
        if (intarry[r, c].Equals(searchInteger)) 
        {
            cnt++;
            Console.WriteLine(
                "string present at position [{0},{1}]" , r, c);         
        } // if
    } // for
} // for
Console.WriteLine("string present {0} times" , cnt);                

此示例假定您不知道数组是否已排序(这意味着:如果您不知道它是否已排序,则必须遍历每个元素并且不能使用二进制搜索)。如果您更了解数组中数据的结构,则可以基于此示例改进性能:

  • 如果行按升序排序,则可以通过二进制搜索替换内部 for 循环
  • 如果整个数组按升序排序并且数据不重复,例如

    int[,] intarry = {{0,1,2}, {3,4,5}, {6,7,8}};

    然后您可以在找到该项目后立即退出循环。最简单的方法是创建一个函数并将 return 语句添加到内部 for 循环。

于 2012-11-06T12:57:17.967 回答