1. 程式人生 > >PAT 1029. Median (25) 求2個排序陣列的中位數——剔除法

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)

解決方案 方法:遞迴法 為了解決這個問題,我們需要理解“中位數的作用是什麼”。在統計中,中位數被用來: 將一個集合劃分為兩個長度相等的子集,其中一個子集中的元素總是大於另一個子集中的元素。 如果理解了中位數的劃分作用,我們就很接近答案了。 首先,讓我們在任一位置