楊氏矩陣介紹:
既然在楊氏矩陣中查找數(shù),那什么是楊氏矩陣呢?
矩陣的每行從
左到右是遞增
的,矩陣從上到下是遞增
的。
例如:
方法:
看到這題我們馬上就可以想到
遍歷一遍數(shù)組
,但無疑這是效率最低的算法,就不展開詳細(xì)來講了
那還有什么樣的算法呢?
我們發(fā)現(xiàn)這歌矩陣是特殊的:
左到右是遞增
的,矩陣從上到下是遞增
的
可以利用這個規(guī)律來做題
思路:
我們發(fā)現(xiàn)右上角的數(shù)比較特殊,是一行中最大的,一列中最小的,
可以用右上角的數(shù)字與target,也就是我們要找的目標(biāo)數(shù)比較
設(shè)arr[x][y]
為右上角元素
-
有三種情況:
-
1.當(dāng)
arr[x][y]==target
,我們返回 -
2.當(dāng)
arr[x][y]>target
,說明target有可能在這列
則我們需要令y--
,向左進(jìn)行縮減排查 -
3.當(dāng)
arr[x][y]<target
,說明target不可能在這一行,
需要x++
,到下一行繼續(xù)尋找
代碼實現(xiàn):
//我們假設(shè)找到了返回1,沒找到返回1
int find(int arr[][3], int row, int col,int target)
{
int x = 0;
int y = col - 1;
while (x <= row && y >= 0)
{
if (arr[x][y] == target)
return 1;
else if (arr[x][y] < target)
x++;
else
y--;
}
return 0;//沒找到時返回0
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int target = 0;
scanf("%d", &target);
int ret = find(arr, 3, 3, target);
if (ret == 1)
printf("找到了\n");
else
printf("沒找到\n");
return 0;
}
那如果我們要實現(xiàn)返回下標(biāo)的又該如何寫呢?
在C語言中是不存在同時返回2個參數(shù)的方法的
不過
我們可以將兩個數(shù)的地址傳參,用解引用進(jìn)行對原數(shù)的修改
代碼實現(xiàn):文章來源:http://www.zghlxwxcb.cn/news/detail-705877.html
void find(int arr[][3], int* row, int* col, int target)
{
int x = 0;
int y = 2;
while (x <= row && y >= 0)
{
if (arr[x][y] == target)
{
*row = x;
*col = y;
return;
}
else if (arr[x][y] < target)
x++;
else
y--;
}
*row = -1;
*col = -1;
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int target = 0;
scanf("%d", &target);
int x = 3;
int y = 3;
find(arr, &x, &y, target);
if (x != -1)
printf("找到了,下標(biāo)是%d %d\n", x, y);
else
printf("沒找到\n");
return 0;
}
歡迎大家糾錯與討論文章來源地址http://www.zghlxwxcb.cn/news/detail-705877.html
到了這里,關(guān)于【C語言】每日一題(楊氏矩陣查找數(shù))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!