求兩個不等長、有序陣列a和b的中位數的最優解(排除法 )
求兩個排序陣列A和B的中位數
最優解 O(log (m+n))
不斷刪除個 k/2個數,然後 k = k/2
不斷刪掉陣列中肯定不是第k小的那些數字,從而能夠不斷地減小陣列,在這個過程中,我們要找的那個數字的序號(k)也會不斷地減小。
陣列中的哪些數字可以刪除呢?
讓我們假設k是4:
nums1: [a1, a2, a3, ...]
nums2: [b1, b2, b3, ...]
如果a2<b2,那麼a2肯定可以刪除。因為有可能比a2小的數字只有:
- a1。它肯定比a2小,因為陣列已排序。
- b1。它有可能比a2小。
因此,a2最多隻能是第3小的數字,肯定比我們要找的第4數字要小!從而a2,以及比a2還小的a1,都可以刪除。
刪除這兩個數字以後,問題變成了:
nums1: [a3, ...]
nums2: [b1, b2, b3, ...]
從以上兩個已排序陣列中找出第2小的數字。(k已經變了,因為我們已經刪除了兩個比我們要找的那個數字還小的數字。)
同理,我們可以刪除a3和b1中較小的那個數字,然後問題變成從剩餘數字中找到第1小的數字。這個問題不就簡單了嗎?
原文來自微信。
相關推薦
求兩個不等長、有序陣列a和b的中位數的最優解(排除法 )
求兩個排序陣列A和B的中位數 最優解 O(log (m+n)) 不斷刪除個 k/2個數,然後 k = k/2 不斷刪掉陣列中肯定不是第k小的那些數字,從而能夠不斷地減小陣列,在這個過程中,我們要找的那個數字的序號(k)也會不斷地減小。 陣列中的哪些數字可以刪除
求兩個等長有序陣列的中位數的logN演算法 分治法
http://blog.csdn.net/yangliuy/article/details/7194199 題目:有兩個長為n的非遞減陣列A和B,把B接在A的後面變成長為2n的陣列C。設計演算法求C的中位數(第n小數)。 思路:O(n)的演算法很容易找到,關鍵是用二
求兩個等長有序序列的中位數
/*現有兩個等長的升序序列的序列A,B,試設計一個時間和空間都儘可能高效的演算法,找出兩個序列的中位數 演算法的基本思想是:分別求出兩個序列的中位數,即為a b,有下列三種情況 1:a=b;即a 為兩
問題描述:求兩個字串str1、str2的最長公共子序列。
首先明白兩個區別: 1、最長公共子串:子串是串的一個連續的部分,在原字串中位置是連續的 2、最長公共子序:不改變序列的順序,從序列中去掉任意的元素而獲得新的序列,也就是說子序在原字串中位置可以不連續。 遞推方程: 步驟:1序列str1和序列str2 ·長度分別為m和
求兩個已排序(升序)等長的整數陣列所有元素的中位數
演算法課的題目,給定兩個整數陣列x[], y[],兩個陣列已被排序(升序),陣列長度都是n,求這2n個數的中位數。 最容易想到的是,新建立以個數組 z[2n],將x[],y[]的所有元素排序放入,然後取中間兩個數,不過當陣列很大時,效率不行啊。<^
定義一個複數類Complex,過載運算子“+”,“-”,“*”,“/”,使之能用於複數的加、減、乘、除。運算子過載函式作為Complex類的成員函式。編寫程式,分別求兩個複數之和、差、積和商。
#include <iostream> #include <iomanip> using namespace std; class Complex { public: Complex(); Complex(double r
求兩個排好序的陣列的中位數
The overall run time complexity should be O(log (m+n)). 這是Princeton演算法公開課的課後習題。 資源:http://www.lintcode.com/en/problem/median-of-two-sorted-arrays/ 用二分法很好
求兩個等長升序序列的中位數
1. 演算法要求 一個長度為L(L≥1)的升序序列S,處在第L / 2(若為小數則去掉小數後加1)個位置的數稱為S 的中位數。例如,若序列S1=(11,13,15,17,19),則S1 的中位數是15,兩個序列的中位數是含它們所有元素的升序序列的中位數。例
Java:定義五個函式,分別實現①計算陣列的最大值MAX②最小值MIN③陣列和SUM④拼接兩個陣列a和b⑤擷取a陣列的一部分
import java.io.IOException; public class Arr8{ //1.計算陣列中最大值 public static int arrayMaxElement(int [] data){ if(data == null){
JavaScript的事件、DOM模型、事件流模型以及內置對象詳解(三)
dde function n) 事件冒泡 字符 nds rep == 防止 JS中的事件 JS中的事件分類 1.鼠標事件: click/dbclick/mouseover/mouseout 2.HTML事件: onload/onunload
求圖中兩點最短路徑(dijkstra) go實現
import ( "testing" "strconv" "fmt" ) // V - S = T type Dijkstra struct { Visit bool // 表示是否訪問 Val int // 表示距離 Path string // 路徑的顯示 }
劍指offer:旋轉陣列中的最小數字(java)
/** * 題目: 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 N
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
用字尾陣列求兩個字串的最長公共子串
對於兩個字串,不好直接運用字尾陣列,所以我們可以把兩個子串串中間用一個在字串中不會出現的字元連線起 來,比如'$‘,計算字尾陣列,檢查字尾陣列中所有相鄰字尾。分屬於兩個字串的字尾的lcp的最大值就是答案。 因為字串的任何一個子串都是這個字串某個字尾的字首。求A和B 的最長公
【c語言】求方程式 ax^2+bx+c=0 的根,分別考慮:1、有兩個不等的實根 2、有兩個相等的實根
// 求方程式 ax^2+bx+c=0 的根,分別考慮:1、有兩個不等的實根 2、有兩個相等的實根 #include <stdio.h> #include <math.h> int main() { int d; int a,b,c; do
求兩個有序整型陣列的交集
1. 問題描述 有兩個有序的整型陣列a和b(沒有重複元素),他們的長度分別為lenA和lenB,求出他們的共同元素。 例如:a = 0,1,3,5,7,9,11;b = 2,3,4,7,11; 它們的交集為{3,7,11}。 2. 方法思
求兩個有序陣列的中位數-演算法導論
Question There are 2 sorted arrays A and B of size n each. Write an algorithm to find the median of the array obtained after merging th
求兩個有序整型數組的交集
rip trac 哈希查找 comm views 整型 沒有 能夠 當前 1. 問題描寫敘述 有兩個有序的整型數組a和b(沒有反復元素),他們的長度分別為lenA和lenB,求出他們的共同元素。 比如:a = 0,1,3,5,7,9,11。b
求兩個字符串的最長公共子串——Java實現
求解 ont ins oid info ++ 題意 短字符串 clas 要求:求兩個字符串的最長公共子串,如“abcdefg”和“adefgwgeweg”的最長公共子串為“defg”(子串必須是連續的) public class Main03{ // 求解兩個字符號的最
資料結構:求兩個有序列表的交集,並集
1.求兩個有序列表的交集 LNode* Intersection(LNode* La,LNode* Lb) { if (La==NULL||Lb==NULL) { return NULL; } LNode *pCHead = NULL; //A與B交集頭 LNode *pCE