劍指offer-陣列中的逆序對-Java
題目描述:
在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007
思路解析:
- 基本的方法是從前到後挨個比較,時間複雜度是O(n^2); 優化方法的時間複雜度是O(nlogn);
- 優化方法是分治法,把陣列一分為二子陣列,再分為子陣列,直到為一個數字是一個數組的時候,先統計子陣列的逆序對的數目,統計的過程中就把順序按從小到大排序,此時用的歸併排序。然後再統計出兩個相鄰的子陣列之間的逆序對的數目。
- 細節:1.Sort()裡面用遞迴的方法達到一直分為一個數字,條件是left<right。2.計算result的時候注意前面的 array[i ]已經大於後邊的array[ j] 了,由於是兩邊都是排好序的,所以i到mid的值都是比j大的.
圖片來自網路。
程式碼:
public class Solution {
private int result=0;//儲存交換次數
static int[] temp; //排序所需要的額外的空間
public int InversePairs(int[] array) {
//無效的輸入
if(array==null||array.length<=0){
return 0;
}
temp = new int[array.length];
sort(array,0,array.length-1);
return result;
}
public void sort(int[] array,int left,int right){
if(left<right){
int mid = (left+right)/2;
sort(array,left,mid);
sort(array,mid+1,right);
merge(array,left,mid,right);
}
}
public void merge(int[] array,int left,int mid,int right){
int i=left;
int j=mid+1;
int current=0;
while(i<=mid && j<=right){
if(array[i]>array[j]){
temp[current++] = array[j++];
result += mid - i +1;//如果i>j的話,那麼從下標i到mid之間的數字都是大於array[j]的
if(result>1000000007){
result%=1000000007;
}
}
else{
temp[current++]=array[i++];
}
}
while(i<=mid){
temp[current++]=array[i++];
}
while(j<=right){
temp[current++]=array[j++];
}
/*和下面的程式碼是一個意思
for(i=0;i<current;i++){
a[left+i]=temp[i];
}*/
current=0;//在原來陣列的基礎上,繼續新增進已排好的數列
while(left<=right){
array[left++]=temp[current++];
}
}
}
相關推薦
劍指offer-陣列中的重複數字(Java)
文章目錄 題目描述 示例 解析 題目描述 在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。
劍指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)
20.劍指offer-陣列中的逆序對
1.題目 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即
劍指offer-陣列中的逆序對計算(python實現)
劍指offer-陣列中的逆序對計算(牛客網題目,python實現) 問題描述 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸
劍指offer-陣列中的重複數字-不可改變輸入陣列(Java)
文章目錄 題目描述 示例 解析 題目描述 在一個長為n+1的數組裡的所有數字都在1~n的範圍內,所以陣列中至少有一個數字是重複的,請找出陣列中任意一個重複的數字,但不能修改輸入的陣列。 示例 輸入:
劍指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,將數字