亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言楊氏矩陣查找算法實例講解

 更新時間:2022年09月22日 08:41:46   作者:碳基肥宅  
楊氏矩陣是一個數(shù)字矩陣,矩陣的每一行從左到右一次遞增,矩陣從上到下遞增,在這樣的矩陣中查找一個數(shù)字是否存在。時間復(fù)雜度小于O(N),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪

本文以C語言實現(xiàn),介紹楊氏矩陣中通用的查找算法。

一、楊氏矩陣介紹

楊氏矩陣種,每一行的數(shù)都從左到右遞增,每一列的數(shù)都從上到下遞增。如下圖是一個簡單的楊氏矩陣:

有一個數(shù)字矩陣,矩陣的每行從左到右是遞增的,矩陣從上到下是遞增的,請編寫程序在這樣的矩陣中查找某個數(shù)字是否存在。

要求:時間復(fù)雜度小于O(N)

二、查找算法

1.查找思路

楊氏矩陣是很有特點的,它有規(guī)律遞增的特點決定了針對表中的任一元素,它的下方和右方的數(shù)一定大于我,左方和上方的數(shù)一定小于我,所以查找的時候可利用這一特點,從右上角或者左下角來找。

因為這兩個位置的大于小于有區(qū)分度。例如,若選擇從右上角找,那么沒有上邊和右邊,而下邊一定比我大,左邊一定比我小。那么,如果要查找的數(shù)比遍歷到的元素大,那我就向下查找;如果比遍歷到的元素小,那我就向左查找。

這樣查找的次數(shù)只有x+y-1次,符合題目中要求的O(n)。

2.步驟

3.代碼

int Check(int a[ROW][COL],int row,int col,int k) {
	int x = 0;
	int y = col - 1;
	while(x <= row-1 && y >= 0){
		if (k > a[x][y]) {    //比我大就向下
			x++;
		}
		else if (k < a[x][y]) {    //比我小就向左
			y--;
		}
		else {
			return 1;    //相等:找到了
		}
	}
	return 0;    //沒有找到
}
int main() {
	int a[ROW][COL] = { {1,2,3,4},{5,6,7,8},{9,10,11,12}};//示例
	int k = 0;    //要查找的數(shù)
	printf("請輸入你要找的數(shù):\n");
	while(~scanf("%d", &k)){
		if (Check(a, ROW, COL, k)) {
			printf("找到了!\n");
		}
		else {
			printf("該數(shù)不存在!\n");
		}
	}
	return 0;
}

三、楊氏矩陣例題

傳送門

代碼

該題相當于是前面楊氏矩陣查找的直接運用。注意,當題干中出現(xiàn) “一個二維數(shù)組array中(每個一維數(shù)組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序” 這樣的描述時,要立馬反應(yīng)過來它是楊氏矩陣??赡懿粫康李}的矩陣都像{{1,2,3,4},{5,6,7,8},{9,10,11,12}}這樣規(guī)整,但只要關(guān)注并發(fā)現(xiàn)它的行按一定順序(從左到右或從右到左)遞增,且列也按一定順序(從上到下或從下到上)遞增,那么就可以運用楊氏矩陣算法。(有時候可能題干數(shù)組會是從右向左遞增,從下向上遞增,剛好和楊氏矩陣反一反,但方法通用。)

bool Find(int target, int** array, int arrayRowLen, int* arrayColLen ) {
	int x = 0;
	int y = *arrayColLen - 1;
	while(x < arrayRowLen && y >= 0){
		if(array[x][y] > target) {
			y--;
		}else if(array[x][y] < target) {
			x++;
		}else{
			return true;
		}
	}
	return false;
}

特別注意

針對這串代碼,這里必須附上特別說明。傳二維數(shù)組入函數(shù),函數(shù)頭寫了形參為int** array,注意這并不是直接傳二維數(shù)組名時的形參接收方式。

若實參部分直接傳二維數(shù)組數(shù)組名array,則形參應(yīng)寫為:

//列參數(shù)不可省略
void fun(int array[][col]);

//一維數(shù)組指針
void fun(int (*array)[col]);

而用int** array接收,則調(diào)用方應(yīng)該這樣寫:

#include<stdio.h>
bool Find(int target, int** array, int arrayRowLen, int* arrayColLen ) {
	int x = 0;
	int y = *arrayColLen - 1;
	while(x < arrayRowLen && y >= 0){
		if(array[x][y] > target) {
			y--;
		}else if(array[x][y] < target) {
			x++;
		}else{
			return true;
		}
	}
	return false;
}
int main(){
	int a1[]={1,2,8,9};
	int a2[]={2,4,9,12};
	int a3[]={4,7,10,13};
	int a4[]={6,8,11,15};
	int* p[] = {a1,a2,a3,a4};
	int arrayRowLen = 4;
	int arrayColLen = 4;
    //傳入指針數(shù)組的數(shù)組名,數(shù)組p內(nèi)的元素是指針類型,存放的是另外四個一維數(shù)組名
	printf("%d",Find(100, p,arrayRowLen ,&arrayColLen));
	return 0;
}

四、總結(jié)

概括來說,楊氏矩陣查找的算法是根據(jù)楊氏矩陣中數(shù)遞增規(guī)律特點設(shè)計的,而這種設(shè)計算法的思路可以遷移。若題干變換為其它類型的、其中數(shù)具有變化規(guī)律的矩陣,要能想起楊氏矩陣的查找算法,并嘗試將這種設(shè)計的思路遷移到變式中去。

到此這篇關(guān)于C語言楊氏矩陣查找算法實例講解的文章就介紹到這了,更多相關(guān)C語言楊氏矩陣內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++ Socket設(shè)置接收超時時間的多種方法

    C/C++ Socket設(shè)置接收超時時間的多種方法

    網(wǎng)絡(luò)編程中經(jīng)常需要處理的一個問題就是如何正確地處理Socket超時,對于C/C++,有幾種常用的技術(shù)可以用來設(shè)置Socket接收超時時間,在這篇文章中,我們將詳細介紹如何在C/C++中設(shè)置Socket的非阻塞模式以及如何配置接收超時時間,需要的朋友可以參考下
    2024-01-01
  • C語言計算器的3種實現(xiàn)方法代碼

    C語言計算器的3種實現(xiàn)方法代碼

    這篇文章主要給大家介紹了關(guān)于C語言計算器的3種實現(xiàn)方法,文中通過代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一的參考借鑒價值,需要的朋友可以參考下
    2007-01-01
  • Qt使用windeployqt工具實現(xiàn)程序打包發(fā)布方法

    Qt使用windeployqt工具實現(xiàn)程序打包發(fā)布方法

    本文主要介紹了Qt使用windeployqt工具實現(xiàn)程序打包發(fā)布方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C/C++堆區(qū)專篇精講

    C/C++堆區(qū)專篇精講

    一直以來總是對這個問題的認識比較朦朧,我相信很多朋友也是這樣的,總是聽到內(nèi)存一會在棧上分配,一會又在堆上分配,那么它們之間到底是怎么的區(qū)別呢,讓我們一起來看看
    2022-10-10
  • 用C語言實現(xiàn)五子棋游戲

    用C語言實現(xiàn)五子棋游戲

    這篇文章主要為大家詳細介紹了用C語言實現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 應(yīng)用程序操作NorFlash示例代碼分享(norflash接口使用方法)

    應(yīng)用程序操作NorFlash示例代碼分享(norflash接口使用方法)

    相對于操作NandFlash,操作NorFlash相對簡單,因為基本不需要考慮壞塊,NorFlash也沒有OOB區(qū)域,也跟ECC沒有關(guān)系。讀寫擦除相對容易,下面看個例子吧
    2013-12-12
  • C語言軟件iic虛擬總線中間層設(shè)計詳解

    C語言軟件iic虛擬總線中間層設(shè)計詳解

    這篇文章主要為大家介紹了C語言軟件iic虛擬總線中間層設(shè)計詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • C++表達式求值詳解

    C++表達式求值詳解

    下面小編就為大家?guī)硪黄獪\談C++ 語言中的表達式求值。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-10-10
  • C語言算法的時間復(fù)雜度和空間復(fù)雜度

    C語言算法的時間復(fù)雜度和空間復(fù)雜度

    這篇文章主要介紹了C語言算法的時間復(fù)雜度和空間復(fù)雜度,算法在編寫成可執(zhí)行程序后,運行時需要耗費時間資源和空間(內(nèi)存)資源,更多相關(guān)需要的朋友可以參考一下
    2022-07-07
  • C/C++內(nèi)存泄漏原因分析與應(yīng)對方法

    C/C++內(nèi)存泄漏原因分析與應(yīng)對方法

    內(nèi)存泄漏會導(dǎo)致當前應(yīng)用程序消耗更多的內(nèi)存,使得其他應(yīng)用程序可用的內(nèi)存更少了,那么為什么會內(nèi)存泄漏,我們應(yīng)該怎樣應(yīng)對內(nèi)存泄漏,所以接下來就給大家詳細介紹一下C++內(nèi)存泄漏原因分析與應(yīng)對方法,需要的朋友可以參考下
    2023-07-07

最新評論