一,問題描述
給定兩個整型陣列,找出這兩個陣列中的最大的公共元素。注意條件:①公共元素 ②最大的公共元素
比如: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行),則表明找到了最大公共元素。
演算法的正確性說明:因為使用的是大頂堆。堆頂元素一定是當前陣列中最大的元素,而通過比較兩個堆頂元素,若不相等,則刪除較大的堆頂元素,這樣總能保證:優先找到兩個堆中目前相同且最大的元素。
完整**實現:
//view code給定兩個整形陣列,尋找這兩個陣列的公有的且最大的元素
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);}}
四,參考資料
資料結構--堆的實現之深入分析
排序演算法總結之堆排序
找出兩個整型陣列中的公共元素的最大值
一,問題描述 給定兩個整型陣列,找出這兩個陣列中的最大的公共元素。注意條件 公共元素 最大的公共元素 比如 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...