LeetCode 629. K个逆序对数组(DP)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 629. K个逆序对数组(DP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 動態規劃
- 3. 優化的DP
1. 題目
給出兩個整數 n 和 k,找出所有包含從 1 到 n 的數字,且恰好擁有 k 個逆序對的不同的數組的個數。
逆序對的定義如下:對于數組的第i個和第 j個元素,如果滿i < j且 a[i] > a[j],則其為一個逆序對;否則不是。
由于答案可能很大,只需要返回 答案 mod 109 + 7 的值。
示例 1: 輸入: n = 3, k = 0 輸出: 1 解釋: 只有數組 [1,2,3] 包含了從1到3的整數并且正好擁有 0 個逆序對。示例 2: 輸入: n = 3, k = 1 輸出: 2 解釋: 數組 [1,3,2] 和 [2,1,3] 都有 1 個逆序對。 說明:n 的范圍是 [1, 1000] 并且 k 的范圍是 [0, 1000]。來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/k-inverse-pairs-array
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 動態規劃
- f(i,j)f(i,j)f(i,j)表示i個數,j個逆序對的組合方式種類
- i個數的j個逆序對的組合,可以在i-1個數的基礎上得到
- 把第i個數插入到前面i-1的i個空位上,相應的逆序數會變化
- f(i - 1, j)插在最后,逆序增加0,插在倒數第1個前面,逆序數為1,為保持總逆序數j,那i-1個數的逆序數為j-1,依次類推
- f(i,j)=f(i?1,j)+f(i?1,j?1)+...+f(i?1,j?i+1)f(i, j) = f(i - 1, j) + f(i - 1, j - 1) + ... + f(i - 1, j - i + 1)f(i,j)=f(i?1,j)+f(i?1,j?1)+...+f(i?1,j?i+1)
時間復雜度 O(k?n2)O(k*n^2)O(k?n2)
3. 優化的DP
- f(i,j)=f(i?1,j)+f(i?1,j?1)+...+f(i?1,j?i+1)f(i, j) = f(i - 1, j) + f(i - 1, j - 1) + ... + f(i - 1, j - i + 1)f(i,j)=f(i?1,j)+f(i?1,j?1)+...+f(i?1,j?i+1)
- 代入j=j-1到上式
- f(i,j?1)=f(i?1,j?1)+f(i?1,j?2)+...+f(i?1,j?i)f(i, j-1) = f(i - 1, j-1) + f(i - 1, j - 2) + ... + f(i - 1, j - i)f(i,j?1)=f(i?1,j?1)+f(i?1,j?2)+...+f(i?1,j?i)
- 做差,f(i,j)?f(i,j?1)=f(i?1,j)?f(i?1,j?i)f(i, j)-f(i, j - 1) = f(i - 1, j) - f(i - 1, j - i)f(i,j)?f(i,j?1)=f(i?1,j)?f(i?1,j?i)
- 即 f(i,j)=f(i,j?1)+f(i?1,j)?f(i?1,j?i)f(i, j)=f(i, j - 1) +f(i - 1, j) - f(i - 1, j - i)f(i,j)=f(i,j?1)+f(i?1,j)?f(i?1,j?i)
時間復雜度 O(k?n)O(k*n)O(k?n)
總結
以上是生活随笔為你收集整理的LeetCode 629. K个逆序对数组(DP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员面试金典 - 面试题 03.03.
- 下一篇: LeetCode 478. 在圆内随机生