螞蟻螞蟻;及周長最長分析

紫鳳發表於2013-08-14

今日面試題:螞蟻螞蟻

n只螞蟻以每秒1cm的速度在長為Lcm的竿子上爬行。螞蟻爬到終點會掉下來。兩隻螞蟻相遇時,只能調頭爬回去。對於每一隻螞蟻i,給定其距離竿子左端的距離x[i],但是我們不知道螞蟻的初始朝向。計算,所有螞蟻掉落需要的最短時間和最長時間。

==========================================

周長最長分析

原題

n根長度不一的棍子,判斷是否有三根棍子可以構成三角形,並且找到周長最長的三角形。

分析

首先能夠構成三角形的三根棍子需要滿足什麼條件呢?這個簡直就是常識了:

最長棍子的長度 < 另外兩根棍子的長度和

這是重要條件。

那麼接下來該怎麼辦呢?暴力法——不要總覺得這是恥辱,要這樣想:這是一個好開端。三條邊,三層迴圈。時間複雜度為O(n^3)。這在一般的題目中,都是無法接受的。如何改進的呢?棍子有長有短,我們要找到的是周長最長的。

我們可以對棍子的長度,從大到小排序。從最長的開始找符合構成三角形條件的。找到的第一個就是周長最長的。

下面我們來說明,為什麼第一個找到的,就是最長的。假設我們有如下長度的棍子,並且長度一次遞減。

a b c d e f g

假設opq是第一個可以構成三角形的棍子,假設還存在xyz,構成三角形,且,x+y+z > o + p + q, 因為opq是第一個三角形,則x<=o。則y+z > p+q,任取y、z,則可以找到,o,y,z為一個三角形,周長大於opq,並且,這個三角形,在opq之前找到(因為y或者z,大於p或者q,先遍歷到)。這個與adf是第一個的假設是矛盾的。所以,不存在xyz構成三角形,周長大於adf。

那麼如果找到第一個能夠構成三角形的三根棍子呢?現在棍子的長度已經是排序的。

a b c d e f g

很明顯,我們只需要依次考慮,相鄰三個元素是否能夠構成三角形即可。因為,如果acd構成三角形,abc一定是,而且,周長還要更長。所以這裡O(n),就可以找到周長最長的三角形。前面排序是O(nlogn)。則,總的時間複雜度是O(nlogn).

【分析完畢】

本文來自微信:待字閨中,2013-08-12釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章