k個最小和;及數對數目分析
今日面試題:k個最小和
給定k個陣列,每個陣列有k個整數。每個陣列中選取一個整數,一共k個整數,取其和,一共可以得到k^k個和。給出方法,求得這k^k個和中,最小的k個。
===================================================
數對數目分析原題給定兩個陣列X和Y,元素都是正數。請找出滿足如下條件的數對的數目:
1. x^y > y^x,即x的y次方>y的x次方
2. x來自X陣列,y來自Y陣列
分析
假設陣列X的長度為m,陣列Y的長度為n,最直接的暴力法,時間複雜度為O(m*n),但這樣的話,並不需要都是正數這個條件的。那麼,我們該如何優化呢?
x^y>y^x,對於x和y來講,有什麼規律呢?該如何發現呢?這裡其實有規律的,大多數的條件下,當y>x的時 候,x^y>y^x,但是有一些例外,1,2,3,4幾個數,需要特殊的考慮,比如2^4=4^2。這個大家可以通過在紙上寫寫畫畫來得到,相對繁 瑣,我們就不進一步分析了。
我們可否對於原式做一些數學變換呢?使得式子變化簡單。如何去做呢?這個式子的複雜體現在兩邊都是指數的形式,如何變化一下呢?我們很自然的就想 到,逆運算對數運算,則,兩邊取對數可得:ylog(x)>xlog(y)。這裡同學們可能要問,可以直接取對數麼?取對數之後,大小關係仍舊滿足 麼?這裡是有兩點保證的:
1. 對數函式的性質,單調遞增
2. 題目中的說明:元素都是正數
對於式子:ylog(x)>xlog(y),x和y都是正數,則進一步有:兩邊同時除以xy,則:log(x)/x >log(y)/y。這個式子,看起來也複雜,但是,x和y都在各自的一邊,要簡單的多。 對於log(x)/x >log(y)/y,
1. 陣列X和Y分別計算log(x)/x,log(y)/y
2. 然後對Y進行排序O(nlogn)
3. 遍歷X陣列,對於每一個x,在Y中,進行二分查詢,即可。
總的時間複雜度為O(nlogn + mlogn).
【分析完畢】
本文來自微信:待字閨中,2013-10-26釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 數對數目;及LIS問題分析
- 格點數目;及兄弟數字分析
- 找最小的k個數(優先佇列)佇列
- 找到無序陣列中最小的k個數陣列
- [每日一題] 第二十題:最小的k個數每日一題
- 用PriorityQueue解決選擇最小的K個數問題
- Leetcode 劍指 Offer 40. 最小的k個數LeetCode
- 最大公約數和最小公倍數
- 【演算法拾遺】最大數和最小數演算法
- 消失的數字;及格點數目分析
- 2563. 統計公平數對的數目
- 最大公約數和最小公倍數--java實現Java
- java求一個整數的最小因子Java
- 缺失的數字;及找數字分析
- linux C(hello world)最大公約數和最小公倍數Linux
- 找數字續;及缺失的數字分析
- 找數字;及最長等差數列分析
- Centos下檢視當前目錄大小及檔案個數CentOS
- 杭電OJ 2028求n個數的最小公倍數
- 二叉樹節點個數,葉子個數,第K層個數,最低公共節點二叉樹
- 劍指Offer-把陣列中的數排成一個最小的數陣列
- 兩個陣列分別取出一個來相加,找出和最小的k個陣列
- 求兩個正整數的最大公約數與最小公倍數--C#實現C#
- 求多個數最大公約數、最小公倍數的一種變換演算法演算法
- Codeforces 27E Number With The Given Amount Of Divisors (求約數個數為n的最小數)
- 812考試總結(NOIP模擬37)[數列·數對·最小距離·真相]
- SQL Server中對比表數量,索引數量及procedure數量SQLServer索引
- iOS生成最大最小數之間隨機數iOS隨機
- Kmeans如何確定聚類個數K聚類
- 最小步數(圖論建模)圖論
- 最小的 k 個元素--快排變形
- linux 快速計算檔案數和目錄數 (轉)Linux
- 數字雕刻和繪圖軟體ZBrush和Mudbox哪個好?ZBrush和Mudbox對比分析繪圖ZBrush
- Java對比有引數和無引數Java
- C++:最小公倍數與最大公約數C++
- Mybatis(五)--原始碼分析傳入單個list引數和多個list引數寫法MyBatis原始碼
- LeetCode題解(1512):好數對的數目(Python)LeetCodePython
- 常見效能計數器及分析