當前位置:
首頁 >
剑指Offer - 面试题51. 数组中的逆序对(归并排序,求逆序对)
發布時間:2024/7/5
32
豆豆
生活随笔
收集整理的這篇文章主要介紹了
剑指Offer - 面试题51. 数组中的逆序对(归并排序,求逆序对)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
在數組中的兩個數字,如果前面一個數字大于后面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數。
示例 1: 輸入: [7,5,6,4] 輸出: 5限制: 0 <= 數組長度 <= 50000來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 歸并排序
-
詳見 LeetCode 315. 計算右側小于當前元素的個數(二叉查找樹&二分查找&歸并排序逆序數總結)
-
方法1:后半部出隊寫入臨時數組時,sum + 前半部 沒有出來的個數(比后部出隊的那個大)
-
方法2:前半部出隊,sum+ 后半部 已經出隊的數量(比出隊的那個小),有后續操作,當后半部全部出隊了完畢,前半部繼續出隊,整個后半部分都比剩余的前半部分小。
兩種方法只能取其一。
class Solution {int sum = 0;vector<int> temp; public:int reversePairs(vector<int>& nums) {temp.resize(nums.size());mergesort(nums,0,nums.size()-1);return sum;}void mergesort(vector<int>& arr, int l ,int r){if(l >= r)return;int mid = l + ((r-l)>>1);mergesort(arr,l,mid);mergesort(arr,mid+1,r);merge(arr,l,mid,r);}void merge(vector<int>& arr, int l, int mid, int r){int i = l, j = mid+1, k = 0;// 方法1:后半部出隊,sum+前半部 沒有出來的個數(比后面大的)while(i <= mid && j <= r){if(arr[i] <= arr[j])temp[k++] = arr[i++];else{temp[k++] = arr[j++];sum += mid-i+1;}}while(i <= mid)//后面都出完了,前半部還剩一些temp[k++] = arr[i++];while(j <= r)temp[k++] = arr[j++];for(i = l,j = 0; j < k; )arr[i++] = temp[j++];//---------------------------------------------------//方法2:前半部出隊,sum+ 后半部 已經出隊的數量(比前面的小)while(i <= mid && j <= r){if(arr[i] <= arr[j]){temp[k++] = arr[i++];sum += j-(mid+1);}elsetemp[k++] = arr[j++];}while(i <= mid)//后面都出完了,前半部還剩一些,還需要操作{temp[k++] = arr[i++];sum += j-(mid+1);}while(j <= r)temp[k++] = arr[j++];for(i = l, j = 0; j < k; )arr[i++] = temp[j++];} };總結
以上是生活随笔為你收集整理的剑指Offer - 面试题51. 数组中的逆序对(归并排序,求逆序对)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构--树状数组
- 下一篇: 程序员面试金典 - 面试题 16.02.