1. 程式人生 > >20.劍指offer-陣列中的逆序對

20.劍指offer-陣列中的逆序對

1.題目

在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。
​ 即輸出P%1000000007

2.基本思路

考察的是歸併排序,計算次數時候是在執行合併操作的時候(合併兩個有序的表)。

設陣列為A,將p~q和q+1~r之間的元素合併。設s=p,t=q+1,則逆序對數目計算如下

  • 如果A[s]<=A[t],則不計數
  • 如果A[s]>A[t],則count=count+ q-s+1,(因為此時指標s指向的位置後面的元素都比A[t]要打,故總共有q-s+1個逆序對)

3.程式碼如下

  • 程式碼1
  void Merge(vector<int>&A,int p,int q,int r,unsigned int &allcount)
  { // 合併陣列 p~q 和 q到r 
    int s,t,k;
    int count=0;
    s=p;
    t=q+1;
    k=0;
    vector<int> B(r-p+1,0);
    while(s<=q && t<=r)
    {
        if(A[t]>=A[s])
        {
            B[k++]=A[s++];
        }else
{ B[k++]=A[t++]; if(count>1000000007) count =count%1000000007; count += q-s+1; } } if(s==(q+1)){ // 說明s到頭了 for(;t<=r;++t) B[k++]=A[t]; }else{// 說明t到頭了 for(;s<=q;++s) B[k++]=A[s]; } k=0; s=p; while
(s<=r) // 這裡將r寫成了t,怪不得出錯了 A[s++]=B[k++]; allcount=allcount%1000000007; allcount=(allcount+count)%1000000007; } void MergeSort(vector<int>&A,int low,int high,unsigned int &allcount) { int mid; if(low<high) { mid=(low+high)/2; MergeSort(A,low,mid,allcount); MergeSort(A,mid+1,high,allcount); Merge(A,low,mid,high,allcount); } } int InversePairs(vector<int> data) { if(data.size()<=1) return 0; unsigned int allcount=0; MergeSort(data,0,data.size()-1,allcount); return allcount; }
  • 程式碼2
  int InversePairs2(vector<int> data) {  //  
    if(data.size()<=1)
        return 0;
    unsigned int allcount=0;
    int t,s,i,n;
    t=1;
    n=data.size();
    while(t<data.size())
    {
        s=t;
        t=2*s;
        i=0;
        while(  (i+t)<=n)
        {
            Merge(data,i,i+s-1,i+t-1,allcount);
            i=i+t;
        }
        if( (i+s)<n)
            Merge(data,i,i+s-1,n-1,allcount); 
    }

    return allcount;
  }

相關推薦

20.offer-陣列

1.題目 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 ​ 即

offer——陣列

本題在牛客上用python程式設計是無法順利通過,參考多種方法仍然無效。下面一種方法,感覺還是很優秀的,不過通過率50% class Solution(): def InversePairs(self,data): count=0 datasorted

offer-陣列

題目描述 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007 輸入描述: 題目保證輸入的陣列中沒有的相同的數字 資料

offer 陣列 python

題目描述 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007 樣例 輸入 1,2,3,4,5,6,7,0 輸出 7

Offer - 陣列(Java實現)

題目描述: 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007 示例 輸入 1,2,3,4,5,6,7,0

offer-陣列-Java

題目描述:在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007思路解析:基本的方法是從前到後挨個比較,時間複雜度是O(n^2)

offer-陣列計算(python實現)

劍指offer-陣列中的逆序對計算(牛客網題目,python實現) 問題描述 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸

offer-陣列的重複數字-不可改變輸入陣列(Java)

文章目錄 題目描述 示例 解析 題目描述 在一個長為n+1的數組裡的所有數字都在1~n的範圍內,所以陣列中至少有一個數字是重複的,請找出陣列中任意一個重複的數字,但不能修改輸入的陣列。 示例 輸入:

offer-陣列的重複數字(Java)

文章目錄 題目描述 示例 解析 題目描述 在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。

Offer 陣列唯一隻出現一次的數字

題目: 在一個數組中除了一個數字只出現一次之外,其他數字都出現了三次。請找出那個只出現一次的數字。你可以假設滿足條件的數字一定存在。 思考題: 如果要求只使用 O(n) 的時間和額外 O(1) 的空間,該怎麼做呢? 樣例 輸入:[1,1,1,2,2,2,3,4,4,4] 輸出:3 解

Offer 陣列數值和下標相等的元素

題目: 一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0到n-1之內。在範圍0到n-1的n個數字中有且只有一個數字不在該陣列中,請找出這個數字。 樣例 輸入:[0,1,2,4] 輸出:3 解答: 二分查詢,O(logn),迴圈解法: class S

offer----陣列只出現一次的數字

題目描述 一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。 //所有數字異或,最後得到的是兩個只出現一次的數字異或的結果,從低位到高位 //找到第一異或為1的位,記下來,根據這個位,將原來的陣列分做兩部分,可解 cl

offer----陣列出現次數超過一半的數字

陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。 思路一:排序 將數組裡元素從排序,然後用中間元素判

offer——陣列出現次數超過一半的數字(39題)

題目:陣列中有一個字出現的次數超過陣列長度的一半,請找出這個數字。例如,輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。 解題思想:一定要緊緊抓住輸出數字出現的次數超過陣列長度的一半,這一特性。

offer-陣列只出現一次的數字(陣列

題目描述 一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。 這題想到用map,類似於“陣列中出現次數超過一半的陣列”https://blog.csdn.net/Mr_xuexi/article/details/84555464 其中,data

offer-陣列出現次數超過一半的數字(陣列

題目描述 陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。 看到這個就想到了c++中的map,C++中map提供的是一種鍵值對容器

offer-陣列出現數字超過一半得數字

28.陣列中出現數字超過一半的數字 題目描述 陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。 解題思路:若陣列中有數字出現的

[offer]陣列出現一半的數字

思路: 方法一: 用hashmap儲存數字以及出現的次數,遍歷陣列,找到該數字時就將value+1,在遍歷前判斷value值是否大於陣列長度的一半 方法二: 先對陣列排序,在陣列中間的數即為所求的數 實現: 方法一: import java.util.HashMap; public c

offer:陣列只出現一次的數字(java)

題目:一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次。請些程式找出這兩個只出現一次的數字。要求時間複雜度為O(n),空間複雜度為O(1).     如輸入陣列{2,4,3,6,3,2,5,5},因為只有4,6這兩個數字只出現一次,其他數字都出現了兩次,所以輸出4

Offer - 陣列出現次數超過一半的數字(Java實現)

題目描述: 陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。 思路分析: 方法1:藉助HashMap,將數字