2019 算法面試相關(guān)(leetcode)--遞歸與分治

2019 iOS面試題大全---全方面剖析面試
2018 iOS面試題---算法相關(guān)
1抹镊、七種常見的數(shù)組排序算法整理(C語言版本)
2娘香、2019 算法面試相關(guān)(leetcode)--數(shù)組和鏈表
3苍狰、2019 算法面試相關(guān)(leetcode)--字符串
4办龄、2019 算法面試相關(guān)(leetcode)--棧和隊列
5、2019 算法面試相關(guān)(leetcode)--優(yōu)先隊列
6舞痰、2019 算法面試相關(guān)(leetcode)--哈希表
7土榴、2019 算法面試相關(guān)(leetcode)--樹、二叉樹响牛、二叉搜索樹
8玷禽、2019 算法面試相關(guān)(leetcode)--遞歸與分治
9、2019 算法面試相關(guān)(leetcode)--貪心算法
10呀打、2019 算法面試相關(guān)(leetcode)--動態(tài)規(guī)劃(Dynamic Programming)
11矢赁、2019 算法面試相關(guān)(leetcode)--動態(tài)規(guī)劃之背包問題


遞歸算法(英語:recursion algorithm)在計算機(jī)科學(xué)中是指一種通過重復(fù)將問題分解為同類的子問題而解決問題的方法。遞歸式方法可以被用于解決很多的計算機(jī)科學(xué)問題贬丛,因此它是計算機(jī)科學(xué)中十分重要的一個概念撩银。絕大多數(shù)編程語言支持函數(shù)的自調(diào)用,在這些語言中函數(shù)可以通過調(diào)用自身來進(jìn)行遞歸豺憔。計算理論可以證明遞歸的作用可以完全取代循環(huán)额获,因此在很多函數(shù)編程語言(如Scheme)中習(xí)慣用遞歸來實現(xiàn)循環(huán)。
分治算法的基本思想是將一個規(guī)模為N的問題分解為K個規(guī)模較小的子問題恭应,這些子問題相互獨立且與原問題性質(zhì)相同抄邀。求出子問題的解,就可得到原問題的解昼榛。即一種分目標(biāo)完成程序算法境肾,簡單問題可用二分法完成。

一胆屿、 Pow(x, n)

實現(xiàn) pow(x, n) 奥喻,即計算 x 的 n 次冪函數(shù)。

示例 1:

輸入: 2.00000, 10
輸出: 1024.00000

示例 2:

輸入: 2.10000, 3
輸出: 9.26100

示例 3:

輸入: 2.00000, -2
輸出: 0.25000
解釋: 2-2 = 1/22 = 1/4 = 0.25

說明:

  • -100.0 < x < 100.0
  • n 是 32 位有符號整數(shù)非迹,其數(shù)值范圍是 [?231, 231 ? 1] 环鲤。

1、比較容易想的就是循環(huán)累乘

var myPow = function(x, n) {
    
    let res = 1
    
    if(n < 0){
        
        x = 1/x
        
        n = -n
    }
    
    if(x == 1) return 1
    
    if(x == -1) return n%2 ? -1 : 1

    for(let i = 0; i < n; i++){
        
        res *= x
    }

    return res
};

效率并不理想彻秆,甚至?xí)瑫r楔绞。
2、我們可以嘗試用分治+遞歸算法
xn = x(n/2) * x(n/2)

var myPow = function(x, n) {
    
    if(n == 0 || x == 1) return 1
    
    if(n < 0) return 1/myPow(x,-n)
    
    if(n % 2) return x*myPow(x,n - 1)
    
    return myPow(x*x,Math.floor(n/2))
};

3唇兑、那么能不能不用遞歸呢?只用分治算法

var myPow = function(x, n) {

    if(n < 0){

        x = 1.0/x

        n = -n
    }

    let res = 1

    while(n){

        if(n%2) res *= x

        x *= x

        n = Math.floor(n/2)
    }

    return res
};
二桦锄、 求眾數(shù)

給定一個大小為 n 的數(shù)組扎附,找到其中的眾數(shù)。眾數(shù)是指在數(shù)組中出現(xiàn)次數(shù)大于 ? n/2 ? 的元素结耀。

你可以假設(shè)數(shù)組是非空的留夜,并且給定的數(shù)組總是存在眾數(shù)匙铡。

示例 1:

輸入: [3,2,3]
輸出: 3
示例 2:

輸入: [2,2,1,1,1,2,2]
輸出: 2


同樣是有多種解法
1、首先是暴力法碍粥,就是兩層嵌套鳖眼,效率是O(n2),效率很低,這里不再贅述嚼摩。
2钦讳、我們注意到,題目中有假設(shè)數(shù)組總是存在眾數(shù)
那么可以用排序法,那么數(shù)組中間那個數(shù)就一定是眾數(shù)

var majorityElement = function(nums) {
    
    nums.sort((a,b) => a - b)

    return nums[Math.floor(nums.length/2)]
};

排序時間復(fù)雜度是O(nlogn),而且還會改變數(shù)組枕面,這方法并不推薦
3愿卒、既然是計數(shù),那么很容易想到哈希表去計數(shù)潮秘。

var majorityElement = function(nums) {
    
    let dic = {}

    for (const num of nums) {
     
        dic[num] = (dic[num] || 0) + 1

        if(dic[num] > nums.length/2) return num
    }
};

這種算法時間復(fù)雜度是O(n),但因為引入了哈希表琼开,空間復(fù)雜度也是O(n)

4、摩爾投票法枕荞。既然數(shù)組一定存在眾數(shù)柜候,假設(shè)數(shù)組存在m個數(shù)字,眾數(shù)存在n個躏精,n > m/2渣刷。那么如果數(shù)組去掉一個眾數(shù),再去掉一個其他數(shù)字玉控,眾數(shù)數(shù)目為n - 1,數(shù)組數(shù)目為m - 2飞主,n - 1 > (m - 2)/2,還是會存在眾數(shù)高诺。同樣碌识,如果我們?nèi)サ鬹個眾數(shù),同時去掉k個其余數(shù)字虱而,剩下的數(shù)組還是會存在同樣的眾數(shù)筏餐。

var majorityElement = function(nums) {
    
    let count = 1,res = nums[0]

    for(let i = 1; i < nums.length; i++){
        
        if(nums[i] == res) count++

        else {

            count -- 

            if(count == 0){

                res = nums[i]
    
                count++
            } 
        }
    }
    
    return res
};

該算法同樣用到了分治思想,時間復(fù)雜度O(n),空間復(fù)雜度O(1)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末牡拇,一起剝皮案震驚了整個濱河市魁瞪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惠呼,老刑警劉巖导俘,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剔蹋,居然都是意外死亡旅薄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門泣崩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來少梁,“玉大人洛口,你說我怎么就攤上這事】Γ” “怎么了第焰?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妨马。 經(jīng)常有香客問我挺举,道長,這世上最難降的妖魔是什么身笤? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任豹悬,我火速辦了婚禮,結(jié)果婚禮上液荸,老公的妹妹穿的比我還像新娘瞻佛。我一直安慰自己,他們只是感情好娇钱,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布伤柄。 她就那樣靜靜地躺著,像睡著了一般文搂。 火紅的嫁衣襯著肌膚如雪适刀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天煤蹭,我揣著相機(jī)與錄音笔喉,去河邊找鬼。 笑死硝皂,一個胖子當(dāng)著我的面吹牛常挚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播稽物,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼奄毡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贝或?” 一聲冷哼從身側(cè)響起吼过,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咪奖,沒想到半個月后盗忱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡羊赵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年售淡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慷垮。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡揖闸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出料身,到底是詐尸還是另有隱情汤纸,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布芹血,位于F島的核電站贮泞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏幔烛。R本人自食惡果不足惜啃擦,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饿悬。 院中可真熱鬧令蛉,春花似錦、人聲如沸狡恬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弟劲。三九已至祷安,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兔乞,已是汗流浹背汇鞭。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留庸追,地道東北人霍骄。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像锚国,于是被迫代替她去往敵國和親挪哄。 傳聞我的和親對象是個殘疾皇子皂林,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容