找出兩個整型陣列中的公共元素的最大值

2021-09-22 09:55:31 字數 2440 閱讀 9569

一,問題描述

給定兩個整型陣列,找出這兩個陣列中的最大的公共元素。注意條件:①公共元素   ②最大的公共元素

比如:arr1=   arr2=.假設 arr1 的長度為m,arr2的長度為n

這兩個陣列的最大公共元素是:25

二,思路

①對 arr1 中的每個元素arr1[i],去 arr2 查詢是否也存在 該元素,若存在則標記起來,因為它雖然是公共的,但不一定是最大的。

直到掃瞄完arr1中的所有元素,這種方式的時間複雜度為o(mn),空間複雜度為o(1)

②先對陣列 arr1 排序,再對 arr2 排序。再定義兩個指標 i, j 分別指向 arr1 和 arr2 中的最後乙個元素。比較這兩個陣列中的最後乙個元素,若相等則找到了所求的元素;若不相等,將指向較大的那個元素的指標 前移一位(減1)。

排序的時間複雜度為o(mlogm + nlogn),最壞情況下指標遍歷的時間複雜度為o(m+n),故總的時間複雜度為o(mlogm+nlogn)

③採用 堆 來實現

對兩個陣列分別構造兩個大頂堆,若堆頂元素相同,則堆頂元素就是公共最大的元素。否則,刪除較大的那個堆頂元素,進行堆調整,繼續比較。

陣列1建堆的時間複雜度為o(m),陣列2建堆的時間複雜度為o(n)

一般對於刪除堆頂元素,進行堆調整而言,平均情況下的時間複雜度為o(1)。故平均情況下,時間複雜度應該要比 方法② 中的小。

另外,可以直接在原陣列上進行建堆操作,此時空間複雜度為o(1)

三,方法③**實現

核心**如下:

1

int len_1 = arr1.length - 1;

2int len_2 = arr2.length - 1;

3while(len_1 >= 0 && len_2 >=0)

4

14else

if( max1 < max2)//

如果arr2的堆頂元素要大,則刪除arr2的堆頂元素

15

20else

//arr1的堆頂元素與 arr2的堆頂元素相等了.

21return max1;

22 }

當建立了兩個大頂堆後,比較這兩個大頂堆的堆頂元素,誰大,則刪除誰。當然,刪除了堆頂元素之後,需要進行堆調整以保證堆的性質。

第10行的swap方法就表示 刪除堆頂元素,第11行的percdown方法表示 堆調整。

不斷地刪除堆頂元素,直到:①某個堆中的元素都被刪除了(此時 while迴圈條件不成立了)這表明:兩個陣列中沒有公共元素。

②若兩個堆的堆頂元素相同了(第20-21行),則表明找到了最大公共元素。

演算法的正確性說明:因為使用的是大頂堆。堆頂元素一定是當前陣列中最大的元素,而通過比較兩個堆頂元素,若不相等,則刪除較大的堆頂元素,這樣總能保證:優先找到兩個堆中目前相同且最大的元素。

完整**實現:

//

給定兩個整形陣列,尋找這兩個陣列的公有的且最大的元素

public

class maxcommonele

else

if( max1 < max2)//

如果arr2的堆頂元素要大,則刪除arr2的堆頂元素

else

//arr1的堆頂元素與 arr2的堆頂元素相等了.

return max1;

}return -1;//

-1 means there are no common element

}private

static

void percdown(int arr, int i, int n)

arr[i] = tmp;

}private

static

int leftchild(int i)

private

static

void swap(int arr ,int i, int j)

//hapjin test

public

static

void main(string args) ;

int arr2 = ;

//int arr1 = ;

//int arr2 = ;

//int arr1 = ;

//int arr2 = ;

int res = findcommmax(arr1, arr2);

system.out.println(res);}}

view code

四,參考資料

資料結構--堆的實現之深入分析

排序演算法總結之排序

找出兩個整型陣列中的公共元素的最大值

一,問題描述 給定兩個整型陣列,找出這兩個陣列中的最大的公共元素。注意條件 公共元素 最大的公共元素 比如 arr1 arr2 假設 arr1 的長度為m,arr2的長度為n 這兩個陣列的最大公共元素是 25 二,思路 對 arr1 中的每個元素arr1 i 去 arr2 查詢是否也存在 該元素,若...

求兩個整型陣列的非共有元素

題目描述 給定兩個整型陣列,要求找出不是兩者共有的元素。輸入 有兩行。第1行先給出正整數n n 20 隨後是n個整數,其間以空格分隔。第2行先給出正整數m m 20 隨後是m個整數,其間以空格分隔。輸出 僅一行。按照數字給出的順序輸出不是兩陣列共有的元素,數字間以空格分隔。題目保證至少存在乙個這樣的...

找出兩個List 中不同的元素

public class collectionutil 找出兩個集合中不同的元素 param collmax param collmin return public static collection getdifferent collection collmax,collection collmi...