這個題我拿到沒什麼好的思路,除了乙個個求的方法之外想不出效率更高的方法。這個題看劍指offer的意思是按照歸併排序的方法做的,順便複習一下歸併排序^_^。看到這個題只要能想到用歸併排序的方法做就已經成功了一半了,其次就是一些細節問題。寫**,你又思路,又會將思路用**寫出來才可以。只有思路不會寫**也不行。寫**的時候一定要認真仔細,養成良好的習慣,盡量在寫的時候就少出錯誤,因為修改起來要找到錯誤並非易事。還有就是不要將問題想得太複雜,不用自己嚇唬自己。認真,仔細,這道題有一些點很值得借鑑。特別是對與兩個vector的相互之間的關係的處理,就是我備註的那一行,很巧妙的將乙個vectoe的資料變化給了另乙個vector。
1 #include2 #include 3 #include 4using
namespace
std;
5class
solution
17long
long re = inversecore(data, auxi, 0, len - 1);//
一定要設定成long long,否則只能通過一半測試用例
18return re % 1000000007;19
}20long
long inversecore(vector &v, vector &temp, int start, int
end)
2127
int length = (end - start) / 2;28
long
long left = inversecore(temp,v,start,start+length);//
看清楚這裡的函式呼叫,之所以這樣寫是要把上一次遞迴中對它做的改變給記錄上去
29long
long right= inversecore(temp,v,start+length+1
,end);
3031
int i = start+length;//
記住這種中值數一定是由兩部分構成的,因為start不一定只從0開始
32int j =end;
33int k =end;
34long
long count = 0;35
while (i >= start&&j >= length + start + 1)36
42else
43 temp[k--] = v[j--];44}
45for (; i >= start; i--)
46 temp[k--] = v[i];//
這裡迴圈裡又i--了就不用再減了
47for (; j >= length + start + 1; j--)
48 temp[k--] =v[j];
49return left + right +count;50}
51};
52int
main()53;
56 cout << so.inversepairs(test) <57return0;
58 }
最後說一點,寫**一定要靜下心。好好理清楚思路,寫的時候每一步都想清楚為什麼,大框架要清楚,小細節也不能忽視。
劍指offer系列 陣列中逆序對
題目描述 輸入乙個陣列,求出其中逆序對的總個數 示例 輸入 逆序對有,幾種情況 因此輸出5 分析 利用歸併排序的思想進行排序,時間複雜度o nlgn int inversepairscore vector nums,vector copy,int begin,int end int mid begi...
劍指offer系列 (陣列中重複的數字)
第一題陣列中重複的數字 題目描述 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。分析 由於題目要求時間複雜度 o ...
劍指offer系列 陣列中的逆序對
最近一直在家刷面經,因為疫情也出不去。所以沒事就會在知乎回答別人提出的問題,還有就是刷題。最近leetcode授權了劍指offer的題,然後就當作我是複習吧。目前還在刷,今晚吃飽刷到這道歸併排序的高階題目 陣列中的逆序對,所以寫一篇關於它的題解吧。在陣列中的兩個數字,如果前面乙個數字大於後面的數字,...