PAT 1029. Median (25) 求2個排序陣列的中位數——剔除法
/************************* 題意: 求2個排序陣列的中位數 ************************/ /*********************** 剔除法,以求第幾大元素的角度去看 例如7個元素,則第4大的元素就是中位數。 那麼只要陣列1和陣列2 總共剔除了3個元素後 便可知道第4大是哪一個。 這題leetcode寫過題解了,詳見連結: *************************/ /*********************** 筆記: *********************/ #include<iostream> #include<stdio.h> #include<string> #include<vector> #include<queue> #include<stdlib.h> #include<algorithm> #include<string.h> #include<stack> #include<map> #include<set> #include<unordered_map> using namespace std; #define M 110000 #define INF 0x7fffffff vector<long long> v1,v2; int GetKth(int L1,int L2,int K){ int k1,k2; //v1被剔除完了,則直接輸出結果 if(L1>=v1.size()){ return v2[L2+K-1]; } //v2被剔除完了,則直接輸出結果 else if(L2>=v2.size()){ return v1[L1+K-1]; }//求第1大的元素,則可以直接得到 else if(K==1){ return v1[L1]<v2[L2]?v1[L1]:v2[L2]; } k1 = k2 = K/2; //第5大元素,則判斷當前陣列1的第2大元素,和陣列2的第2大元素 k1--; k2--; //k1和k2僅僅是對應於下標,故下標要-1 if(k1 >= v1.size()) k1 = v1.size()-1; if(k2 >= v2.size()) k2 = v2.size()-1; if(v1[L1+k1] < v2[L2+k2]){ return GetKth(L1+k1+1,L2,K-k1-1); } else if(v1[L1+k1] > v2[L2+k2]){ return GetKth(L1,L2+k2+1,K-k2-1); } else{ //2者相等,判斷一下是否已經可得到結果的情況 if(k1+1+k2+1==K){ //當二者相加為K時,則是其中的1個(並非K為偶數,因為k1可能因為長度問題被壓縮) return v1[L1+k1]; } else{ //K為奇數,則k1+k2+2還達不到K,都剔除,向後。 return GetKth(L1+k1+1, L2+k2+1,K-k1-k2-2); } } } int main(){ long long n1,n2,num; int i; cin>>n1; for(i=0;i<n1;i++){ scanf("%lld",&num); v1.push_back(num); } cin>>n2; for(i=0;i<n2;i++){ scanf("%lld",&num); v2.push_back(num); } int K,K1,K2; if((n1+n2) % 2 ==1){ K = (n1+n2)/2 + 1; //要找第K大的元素。 printf("%lld\n",GetKth(0,0,K)); } //總數為偶數,則要找2箇中位數取平均值 else { K=(n1+n2)/2; printf("%lld\n",GetKth(0,0,K)); } return 0; }
相關推薦
PAT 1029. Median (25) 求2個排序陣列的中位數——剔除法
/************************* 題意: 求2個排序陣列的中位數 ************************/ /*********************** 剔除法,以求第幾大元素的角度去看 例如7個元素,則第4大的元素就是中位數。 那麼只要陣
PAT 1029 Median (25)
1029 Median (25)(25 分) Given an increasing sequence S of N integers, the median is the number at the middle position. For example, the me
(java)求兩個排序陣列(升序)中第K小的數
如題:求兩個排好序的陣列的第K個小的數 思路一:歸併兩個有序陣列,按照順序合併,最後找到第K-1位置的數。時間複雜度為O(N) 思路二:在技術部落格上看到更好的思路,時間複雜度是OLog(m+n); 第k小的數字為x,那麼陣列1一定有i個數字小於x,陣列2一定有j個數字小於
leetcode | Median of Two Sorted Arrays 尋找2個有序陣列中第k大的值
There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time
利用分治法來求兩個排序陣列的中位數
有兩個陣列 ar1[] 和ar2[] 兩個陣列的長度都為n 求ar1[]和ar2[]的中位數 可以借鑑歸併排序的思想 實質上就是將將兩個已經排好序的陣列 合併成一個數組 的過程只是在這個過程中添加
求兩個排序陣列的中位數
設X[1...n]和Y[1...n]為兩個陣列,每個都包含n個已排序好的數。給出一個求陣列X和Y中所有2n個元素的中位數的、O(lgn)時間的演算法。 演算法思想: 1.兩個陣列中小於median的個數為(n - 1)個,假設該median為陣列a中的第k個,k為陣
leetcode 兩個排序的中位數 python
假設 lee pytho per oat sorted tran -s rap 兩個排序數組的中位數 給定兩個大小為 m 和 n 的有序數組 nums1 和 nums2 。 請找出這兩個有序數組的中位數。要求算法的時間復雜度為 O(log (m+n))
[牛客算法系列] 在另個排序陣列中找到第k小的數
題目 給定兩個有序陣列arr1,arr2, 再給定一個整數k, 返回所有數中第k 小的數。 比如 arr1 = [1,2,3,4,5], arr2 = [3,4,5], k =1. 1 是所有數中第
9.27 在兩個排序陣列中找到第K小的數
【題目】: 給定兩個有序陣列arr1和arr2,再給定一個整數k,返回所有的數中第K小的數 舉例: arr1=[1, 2, 3, 4, 5],arr2=[3, 4, 5],k=1 1是所有數中第1小的數,所以返回1 arr1=[1, 2, 3],arr2=[3, 4,
兩個排序陣列中找第k大的數
一、問題給定兩個已經排序好的陣列,找到兩者所有元素中第k大的元素二、解法一:merge--將兩個有序陣列變成一個有序陣列時間複雜度O(m+n),空間複雜度O(m+n)/************************************************* 給定兩個
LeetCode(40) Median of Two Sorted Arrays (兩排序陣列中位數)
題目描述 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time
兩個有序陣列中位數
大小m和n分別有兩個排序陣列A和B。找到兩個排序陣列的中值。總的執行時間複雜度應該是O(log(m+n))。class Solution { public: /** * @param A: An integer array. * @param
1029. Median (25)
ostream elements sort emc number input inf def long Given an increasing sequence S of N integers, the median is the number at the middl
17.零起點學算法12——求2個日期之間的天數
2個 include std ret class %d style 17. amp #include<stdio.h> int main() { int n1,m1,d1,n2,m2,d2,s; while(scanf("%d-%d-%d %d
18.零起點學算法13——求2個時間之間的分鐘數
eof urn ret include amp turn 算法 scanf scan #include<stdio.h> int main() { int h1,m1,h2,m2,s; while(scanf("%d:%d %d:%d",&am
字串處理演算法(六)求2個字串最長公共部分
基礎演算法連結快速通道,不斷更新中: 整型陣列處理演算法部分: 整型陣列處理演算法(一)按照正態分佈來排列整型陣列元素 整型陣列處理演算法(二)檔案中有一組整數,要求排序後輸出到另一個檔案中 整型陣列處理演算法(三)把一個數組裡的所有元素,插入到另一個數組的指定位置 整型陣列
LeetCode 4. Median of Two Sorted Arrays (求兩個有序陣列第k大數字,分治法)
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complex
【LeetCode】4.Median of Two Sorted Arrays 兩個排序陣列的中位數
示例 1: nums1 = [1, 3] nums2 = [2] 中位數是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 中位數是 (2 + 3)/2 = 2.5 解題思路: 糟糕- -沒理解題意,首先需要知道“中位數”
劍指offer 25. 合併兩個排序的連結串列
1.問題描述 輸入兩個單調遞增的連結串列,輸出兩個連結串列合成後的連結串列,當然我們需要合成後的連結串列滿足單調不減規則。 2.解決思路 1)非遞迴的方法 如果可以改變連結串列,直接從頭結點開始依次移動比較兩個連結串列當前值的大小,把較小的值作為當前結點的下一個結點。
leetcode 兩個排序陣列的中位數(Median of Two Sorted Arrays)
解決方案 方法:遞迴法 為了解決這個問題,我們需要理解“中位數的作用是什麼”。在統計中,中位數被用來: 將一個集合劃分為兩個長度相等的子集,其中一個子集中的元素總是大於另一個子集中的元素。 如果理解了中位數的劃分作用,我們就很接近答案了。 首先,讓我們在任一位置