?LeetCode刷題實(shí)戰(zhàn)493: 翻轉(zhuǎn)對(duì)
Given?an?integer?array?nums,?return?the?number?of?reverse?pairs?in?the?array. A?reverse?pair?is?a?pair?(i,?j)?where?0?<=?i??2?*?nums[j].
示例? ? ? ? ? ? ? ? ? ? ? ? ?
示例 1:
輸入: [1,3,2,3,1]
輸出: 2
示例 2:
輸入: [2,4,3,5,1]
輸出: 3
注意:
給定數(shù)組的長(zhǎng)度不會(huì)超過(guò)50000。
輸入數(shù)組中的所有數(shù)字都在32位整數(shù)的表示范圍內(nèi)。
解題
上述過(guò)程大體上描繪了代碼主體的框架,要求出一個(gè)數(shù)組的翻轉(zhuǎn)對(duì)數(shù),我們需要將其劃分為 L 和 R,并求出 L 和 R 中的翻轉(zhuǎn)對(duì)數(shù) v1 和 v2,然后對(duì)排好序的 L 和 R 進(jìn)行合并排序,得到翻轉(zhuǎn)對(duì)數(shù) v3,則數(shù)組本身的翻轉(zhuǎn)對(duì)數(shù)就是 v1 + v2 + v3。
class?Solution?{
public:
????using?ull = unsigned?long?long;
????static?const?int?MAX = 50000;
????long?long?L[MAX / 2?+ 2] = {0}, R[MAX / 2?+ 2] = {0};
????ull Merge(vector<int>& nums, int?left, int?mid, int?right){
????????int?L_end = mid - left;
????????int?R_end = right - mid;
????????for(int?i = 0;i < L_end;++i)
????????????L[i] = nums[left + i];
????????for(int?i = 0;i < R_end;++i)
????????????R[i] = nums[mid + i];
????????L[L_end] = static_cast<long?long>(numeric_limits<int>::max()) + 2;
????????R[R_end] = static_cast<long?long>(numeric_limits<int>::max()) + 2;
????????ull cnt = 0;
????????int?i = 0, j = 0;
????????for(int?k = left;k < right;++k){
????????????if(L[i] < R[j]){
????????????????nums[k] = L[i++];
????????????}else{
????????????????if(R[j] < 0)
????????????????????cnt += L_end - (upper_bound(L, L + L_end, R[j] * 2) - L);
????????????????else
????????????????????cnt += L_end - (upper_bound(L + i, L + L_end, R[j] * 2) - L);
????????????????nums[k] = R[j++];
????????????}
????????}
????????return?cnt;
????}
????int?MergeSort(vector<int>& nums, int?left, int?right){
????????ull v1 = 0, v2 = 0, v3 = 0;
????????if(left + 1?< right){
????????????int?mid = (left + right) >> 1;
????????????v1 = MergeSort(nums, left, mid);
????????????v2 = MergeSort(nums, mid, right);
????????????v3 = Merge(nums, left, mid, right);
????????}
????????return?v1 + v2 + v3;
????}
????int?reversePairs(vector<int>& nums)?{
????????return?MergeSort(nums, 0, nums.size());
????}
};
LeetCode1-480題匯總,希望對(duì)你有點(diǎn)幫助!
LeetCode刷題實(shí)戰(zhàn)481:神奇字符串
LeetCode刷題實(shí)戰(zhàn)482:密鑰格式化
LeetCode刷題實(shí)戰(zhàn)483:最小好進(jìn)制
LeetCode刷題實(shí)戰(zhàn)484:尋找排列
LeetCode刷題實(shí)戰(zhàn)485:最大連續(xù) 1 的個(gè)數(shù)
LeetCode刷題實(shí)戰(zhàn)486:預(yù)測(cè)贏家
LeetCode刷題實(shí)戰(zhàn)487:最大連續(xù)1的個(gè)數(shù) II
LeetCode刷題實(shí)戰(zhàn)488:祖瑪游戲
LeetCode刷題實(shí)戰(zhàn)489:掃地機(jī)器人
LeetCode刷題實(shí)戰(zhàn)491:遞增子序列
LeetCode刷題實(shí)戰(zhàn)492:構(gòu)造矩形
