人々は震え質問に直面しています
。
。
。
我々は、対象に見える
増加操作のために左から右へ、二次元配列の各行を。各列は、上から下に昇順にソート。完了コードは、このような二次元アレイと整数の入力には、アレイは、整数が含まれているか否かを判断します
ルを解決する方法は???
分析:これは、2次元配列である場合には、再度、配列を横断することは完全に可能な問題を解決するために、しかし効率のために、我々は最も少ない数字を通過するために、我々は行と列を分離する必要があり、時間の複雑さを軽減する必要があります。そこで、我々は唯一の問題は、例えば、10時間より10の左と上のエッジを見つけるために、で複雑、かつ以下および10よりも右になったでしょう、何気なく番号を探して、しかし、デジタル裁判官から配列を検索します大きいので、我々は唯一のいくつかの特定のポイントを見つけることができ、例えば、右上には、左下には、あなたの選択をする唯一の方法があります。数字がちょうど++行、9つ以上を探している場合、[行]は[COL]、我々は、例えば、9を取る;数字は9より小さく見える場合、ちょうどcol--、最終的に必要な数を見つけるまで。
コードを見てください
#include<iostream>
using namespace std;
bool find(int *arr, int row, int col, int n)
{
bool flag = false;//标记
if (arr != nullptr&&row > 0 && col > 0)//判断数组是否存在
{
int _row = 0;
int _col = col - 1;
while (_col>0&&_row<row)
{
if (arr[_row*col + _col] > n)
{
_col--;
}
else if (arr[_row*col + _col] < n)
{
_row++;
}
else
{
flag = true;
return flag;
}
}
}
return flag;
}
int main()
{
int arr[4][4] = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } };
bool ret=find((int *)arr, 4, 4, 7);//
cout << boolalpha << ret<<endl;//boolapha使返回值变成true输出
return 0;
}