1. 程式人生 > 其它 >20、【2011統考真題】_【順序表】查詢兩個有序表中的中位數(C++版)

20、【2011統考真題】_【順序表】查詢兩個有序表中的中位數(C++版)

技術標籤:演算法刷題演算法leetcode排序演算法資料結構

題目描述

在這裡插入圖片描述

題目分析

目標是得到兩個有序表中的中位數,已知兩個表的長度,而中位數的特點是位於兩個表中元素個數總和的一半。

解法1

可以通過最簡單的遍歷並結合中位數的特點(元素個數總和的一半),便可以得到目標。
分別定義一個數組下標位於a和b下,從0開始一直遍歷到(n-1)/2,在這個過程中哪個有序表中的數小,就使其下標往後移動,直到到中位數的位置後,返回中位數

int findMid(int a[], int b[], int n){
	int p = 0, q = 0;
	for(int i = 0; i < (n-1)/2; i++
){ if(a[p] <= b[q]) p++; else q++; } if(a[p] <= b[q]) return a[p]; else return b[q]; }

時間複雜度為O(n),空間複雜度為O(1)。

解法2

使用二分搜尋演算法,設A和B中的中位數分別為a和b。
當a = b時,即a或b為中位數;
當a < b時,則捨棄比a小的部分和比b大的部分,需兩次捨棄長度相等;
當a > b時,則捨棄比a大的部分和比b小的部分,需兩次捨棄長度相等。