【LeetCode笔记】剑指Offer 51. 数组中的逆序对(Java、分治)
生活随笔
收集整理的這篇文章主要介紹了
【LeetCode笔记】剑指Offer 51. 数组中的逆序对(Java、分治)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述
- 多說無益~直接沖代碼吧!
思路 && 代碼
1. 暴力 O(n2n^2n2)
- 乍一看這題目,很難不直接用暴力法沖一沖(也就雙層循環(huán)的事)
- 但是不出意料地超時(shí)啦~想一想,O(n2n^2n2)會(huì)超時(shí),那么我們就試著思考怎么降低時(shí)間復(fù)雜度到O(nlogn)吧!(還是不行的話,就再去思考O(n)的方法,循序漸進(jìn)~)
- 于是,分治的思路就躍然于紙上了~
2. 歸并排序法(分治O(nlogn))
- 總體框架應(yīng)該是和歸并排序一樣的
- 從頭思考,如果采用分治的方法進(jìn)行二分,需要有怎樣的考慮?
- 當(dāng)前遞歸層的結(jié)果,首先應(yīng)該是左半邊內(nèi)部的結(jié)果 + 右半邊內(nèi)部的結(jié)果
- 然后,應(yīng)該再對左半邊與右半邊的聯(lián)系進(jìn)行處理
- 為什么要排序?
- 首先,我們通過二分遞歸的形式,占用了O(logn)的復(fù)雜度
- 然后,我們需要使用剩下的O(n)復(fù)雜度,完成剩下的步驟
- 而排序,占用了O(n)復(fù)雜度,同時(shí)實(shí)現(xiàn)了剩下的步驟
- 左半邊排序、右半邊排序后,并不會(huì)影響左右半邊直接的聯(lián)系,也就是無后效性
- 合并操作:
- 維護(hù) lowIndex,用于記錄插入左半邊值后,新增的逆序?qū)Α?/li>
- 插入左半邊值后,增加的逆序?qū)?= 已經(jīng)插入的右邊值個(gè)數(shù)
- 注意:左半邊當(dāng)前值、右半邊當(dāng)前值相同的情況,選擇插入左半邊當(dāng)前值,這是為了保證正確性。(可以寫個(gè)例子考慮一下就知道原因了~)
二刷
- 歸并排序的思想可太能套用了!
總結(jié)
以上是生活随笔為你收集整理的【LeetCode笔记】剑指Offer 51. 数组中的逆序对(Java、分治)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: select 移动端 第一个无法选中_总
- 下一篇: 【LeetCode笔记】22.括号生成(