在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。
示例 1:
輸入: [7,5,6,4]
輸出: 5
限制:0 <= 陣列長度 <= 50000
思想是「分治演算法」,所有的「逆序對」**於 3 個部分:
左邊區間的逆序對;
右邊區間的逆序對;
橫跨兩個區間的逆序對。
用這種「算貢獻」的思想在合併的過程中計算逆序對的數量的時候,只在 lptr 右移的時候計算,是基於這樣的事實:當前 lptr 指向的數字比 rptr 小,但是比 rr 中 [0 … rptr - 1] 的其他數字大,[0 … rptr - 1] 的其他數字本應當排在 lptr 對應數字的左邊,但是它排在了右邊,所以這裡就貢獻了 rptr 個逆序對。
複雜度分析
記序列長度為 n。
複雜度分析
記序列長度為 n。
使用兩層 for 迴圈列舉所有的數對,逐一判斷是否構成逆序關係。
複雜度分析:
class
solution
intmergesort
(vector<
int>
& nums, vector<
int>
& tmp,
int left,
int right)
int mid = left +
(right - left)/2
;int count =
mergesort
(nums, tmp, left, mid)
+mergesort
(nums, tmp, mid+
1, right)
;int i = left;
int j = mid+1;
int pos = left;
while
(i <= mid && j <= right)
else
}for
(int k = i; k <= mid;
++k)
for(
int k = j; k <= right;
++k)
copy
(tmp.
begin()
+left, tmp.
begin()
+right+
1, nums.
begin()
+left)
;return count;}}
;
class
bit//最低位,二進位制數從右邊起的第乙個1的位置
static
intlowbit
(int x)
intquery
(int x)
return ret;
}void
update
(int x)}}
;class
solution
// 樹狀陣列統計逆序對
bit bit
(n);
//構造陣列陣列
int ans =0;
for(
int i = n-
1; i >=0;
--i)
return ans;}}
;
歸併排序(分治思想):階段排序結果
樹狀陣列或二叉索引樹(binary indexed tree, fenwick tree)
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...
LeetCode每日一題(題139)
題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...
LeetCode 每日一題(2020 4 6)
示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 思路 使用雙層for迴圈,外層遍歷陣列,尋找當前元素與target的差值,內層迴圈遍歷整個陣列,尋找有沒有值與差值相同。如果找到,返回兩個元素的下標。let twosum fu...