資料結構與演算法 陣列

2021-09-07 16:55:42 字數 3588 閱讀 1128

題型1:如何用遞迴實現陣列求和

方法1:

題型2:如何用乙個for迴圈列印乙個二維陣列

方法1:array在二維陣列中的行號和列號分別為[i/maxy],[i%maxy]

題型3:用遞迴和非遞迴的方法實現二分查詢

題型4:如何在排序陣列中,找出給定數字出現的次數

方法1:二分查詢,分別找出左邊界和右邊界,左右邊界的差

方法2:順序查詢,統計計數

題型5:如何計算兩個有序整型陣列的交集

方法1:採用二路歸併來遍歷兩個陣列,分別用i、j從頭開始遍歷兩個陣列,如果arr[i]arr[j],j++;否則將arr[i]存放到交集中,i++,j++;

方法2:順序遍歷兩個陣列,將陣列元素存放到雜湊表中,同時統計的陣列元素進行計數。如果為2,則為兩者的交集元素

方法3:遍歷兩個陣列中任意乙個陣列,將遍歷得到的元素放到雜湊表,然後遍歷另外乙個陣列,同時對建立的雜湊表進行查詢,如果存在,則為交集元素

題型6:如何找到陣列中重複次數最多的數

方法1:以空間換時間,可以定義乙個陣列int count[max],並將其陣列元素都初始化為0,然後遍歷陣列,對count[a[i]]++操作,在count中找出最大的數。

方法2:使用map對映表,通過引入map表,其中第一為關鍵字,第二個為關鍵字出現的次數,然後判斷次數大小。

題型7:如何在o(n)的時間複雜度內找到陣列**現次數超過了一半的數

方法1:hash法,首先建立乙個hash_map,其中key為陣列元素值,value為此數出現的次數。遍歷一遍陣列,用hash_map統計每個數出現的次數。

方法2:partition法,由於出現次數最多的元素肯定也會是中位數,所以,每次用patition找到乙個數的位置,如果該數剛好為中位數,則就是超過了一半的數。

方法3:每次取出兩個不同的數,剩下的數字中重複出現的數字肯定比其他數字多,將規模縮小化。如果每次都刪除兩個不同的數,那麼剩下的數字裡,原頻度最高的數出現的頻率一樣超過了50%。

題型8:如何找到陣列中唯一的重複元素(陣列a[n],1至n-1個數存放在a[n]中,其中某個數重複一次)

方法1:由於題目要求每個元素只訪問一次,不用輔助儲存空間,可以從原理上入手,採用數學求和法,因為只有乙個數字重複一次,而數又是連續的,根據累加原理,對陣列的所有項求和,然後減去1至n-1的和,即為所求的重複數。

方法2:採用異或的方法,相同的數為0,不相同的數為1.

方法3:位圖法,首先申請乙個長度為n-1且均為『0』組成的字串,然後從頭開始遍歷陣列a[n],取每個陣列元素a[i]的值,將其對應的字串中的相應位置置為1,如果已經置過1,那麼該數就是重複的數。

題型9:如果判斷乙個陣列中的數值是否連續相鄰

乙個整數數列,元素取值可能是0~65535中的任意乙個數,相同元素不會重複出現;0是個例外,可以反覆出現。如果最大值和最小值的差距大於0的個數,那麼就是不連續的。(如果陣列中的元素有重複的,則需要順序求看是否有重複元素以及間隔)

題型10:如何找出陣列**現奇數次的元素

方法1:使用異或的方法,將所有元素進行異或最後剩下的將是出現奇數次的元素

引申:由n個元素組成的陣列,n-2個數出現了偶數此,兩個數出現了奇數次(這兩個數不相等),如何用o(1)的空間複雜度,找出這兩個數?

將所有數異或之後,結果相當於將不相等的兩個數a和b異或。x=a^b,求出x中最低位為1,其中肯定a和b中有乙個數的該位是為1的,對陣列中所有該位為1的數進行異或,所有該位為0的數進行異或。將能分別得到這兩個數。

題型11:如何找出數列中符號條件的數對的個數

方法1:蠻力法,求所有可能的數對的和,看其和是否為該數

方法2:先對陣列進行排序,然後使用二分查詢方法,用兩個指示器分別指向第乙個和最後乙個元素,然後從兩端同時向中間遍歷,直到兩個指標交叉。

方法3:用計數排序,將1~n個數放在一塊很大的空間裡面,比如1放在1號位,n放在n號位,o(n)的時間複雜度,然後取值。

引申:如果是任意陣列而不是有規律的陣列,如何求解陣列對?即給定乙個任意整數陣列array[n],尋找陣列中和值為sum的數對。

方法1:蠻力法

方法2:同上面的方法2

方法3:將陣列hash到hash表,然後在hash表中查詢sum-m

引申:已知大小分別為m、n的兩個無序陣列a、b和乙個數常數c,求滿足a[i]+b[j]=c的所有a[i]和b[j]

方法1:列舉法

方法2:排序+二分查詢法

方法3:排序+線性掃瞄法

方法4:map,將乙個陣列存放到map中,遍歷另乙個陣列,對於數m,在map中查詢sum-m

題型12:如何尋找數列中缺失的數

給乙個由n-1個整數組成的未排序的序列,其元素都是1~n中的不同的整數。如何尋找序列中缺失的整數

可以通過累加求和。首先將該n-1個整數詳解,得到sum,然後用(1+n)n/2減去sum,得到的差即為缺失的整數。

題型13:如何判定陣列是否存在重複元素(假設陣列a有n個元素,元素取值範圍是1~n,如何判定陣列是否存在重複元素)

方法1:對陣列進行排序,然後比較相鄰的元素是否相同。時間複雜度o(nlogn)

方法2:使用bitmap方法,定義長度為n/8的char陣列,每個bit表示對數字是否出現過。遍歷陣列,使用bitmap對數字是否出現進行統計。時間複雜度o(n),空間複雜度o(n)

方法3:遍歷陣列,假設第i個位置的數字是a[i],並且i!=a[i],則將a[i]交換到下標為a[i]的位置,如果下標為a[i]的位置已經有a[i]==a[a[i]],則出現重複了。

題型14:如何重新排序陣列使陣列左邊為奇數,右邊為偶數。

方法1:使用快速排序類似的方法,使用兩個指標分別指向頭和尾,如果不是指向對應的數,則將二者進行交換

題型15:如何把乙個整型陣列中重複的數字去掉。

方法1:就是遍歷陣列的每乙個元素,將元素與前面的已經遍歷過的元素進行逐一比較,如果發現與前面的陣列重複,則去掉;如果沒有重複,則繼續遍歷下乙個元素。由於每乙個元素都要與之前所有元素比較,所以時間複雜度為o(n^2)

方法2:將元素進行排序,然後遍歷每乙個元素,並用count記錄不重複元素的個數,如果當前元素與它前乙個元素不相同,執行a[count]=a[i],count++;否則執行下一次迴圈。

題型16:如何找出乙個陣列中第二大的數。

方法1:對所有元素進行排序,第二大的數在第二個位置

方法2:用兩個變數分別記錄第一大和第二大的數,對於最大值初始值為首元素,第二大的數初始化為最小的負數。每次用當前元素與最大值比較,如果大於最大值,則將其賦給最大值,將原最大值賦給第二大值,否則如果小於最大值,則與第二大值進行比較。

題型17:如何將陣列的後面m個數移動為前面m個數

方法1:

將前m個元素的順序顛倒;

將後面n-m個元素的順序顛倒

將n個元素的順序全部顛倒

題型18:如何計算出序列的前n項資料

正整數序列q中的每個元素都至少能被正整數a和b中的乙個整除,現給定a和b,如何計算出q中的前幾項?例如,當a=3,b=5,n=6時,序列3,5,6,9,10,12.可以和歸併聯絡起來,給定兩個陣列a、b,陣列a 存放:3*1,3*2,3*3...陣列b存放5*1,5*2,5*3...有兩個指標i、j分別指向a、b的第乙個元素,取min(a[i],b[j])並移動較小值的指標,然後繼續比較。

引申:醜數,是只能包含因子2 3 5的數。

資料結構與演算法 陣列

陣列是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。其中有幾個重要的概念 非線性表 連續的記憶體空間 儲存相同型別的資料 如圖所示,這是乙個長度為5的int陣列arr,我們假設起始的記憶體位址為1000,那麼第乙個元素的記憶體位址範圍就是 1000 1003,這是因為乙...

資料結構與演算法 陣列

陣列是由相同型別的元素 element 的集合所組成的資料結構,分配一塊連續的記憶體來儲存。利用元素的索引 index 可以計算出該元素對應的儲存位址。維基百科 陣列是線性表資料結構,定義陣列時,系統會分配乙份連續的記憶體空間來儲存一組相同的型別的資料,如int num n 陣列定義為一維陣列 二維...

資料結構與演算法 陣列

陣列是由相同型別的元素 element 的集合所組成的資料結構,分配一塊連續的記憶體來儲存。利用元素的索引 index 可以計算出該元素對應的儲存位址。維基百科 1.儲存結構 陣列是線性表資料結構,定義陣列時,系統會分配乙份連續的記憶體空間來儲存一組相同的型別的資料,如int num n 2.多維陣...