java實(shí)現(xiàn)數(shù)組中的逆序?qū)?/h1>
更新時(shí)間:2019年03月03日 16:41:47 作者:雨幕下的稻田
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)數(shù)組中的逆序?qū)Γ哂幸欢ǖ膮⒖純r(jià)值,感興趣的小伙伴們可以參考一下
在數(shù)組中的兩個(gè)數(shù)字,如果前面一個(gè)數(shù)字大于后面的數(shù)字,則這兩個(gè)數(shù)字組成一個(gè)逆序?qū)?,例如在?shù)組{7,5,6,4}中,一共存在5對(duì)逆序?qū)Γ謩e是{7,6},{7,5},{7,4},{6,4},{5,4}。輸入一個(gè)數(shù)組,求出這個(gè)數(shù)組中的逆序?qū)Φ目倲?shù)P。并將P對(duì)1000000007取模的結(jié)果輸出。,即輸出P%1000000007。
代碼
解法一
暴力簡(jiǎn)單低效,不會(huì)改變?cè)瓟?shù)組
public static int inversePairs(int[] array) {
if (array == null || array.length < 2) {
return 0;
}
int count = 0;
for (int i = 0; i < array.length; i++) {
for (int j = i + 1; j < array.length; j++) {
if (array[i] > array[j]) {
count++;
}
}
}
return count % 1000000007;
}
解法二
利用數(shù)組的歸并排序,高效,但是會(huì)改變?cè)瓟?shù)組
public static int inversePairs2(int[] array) {
if (array == null || array.length < 2) {
return 0;
}
int count = mergeSort(array, 0, array.length - 1);
return count % 1000000007;
}
private static int mergeSort(int[] array, int start, int end) {
if (start >= end) {
return 0;
}
// 找到數(shù)組的中點(diǎn),分割為兩個(gè)子數(shù)組,遞歸求解
int middle = (start + end) / 2;
int left = mergeSort(array, start, middle);
int right = mergeSort(array, middle + 1, end);
// 存儲(chǔ)歸并后的數(shù)組
int[] copy = new int[array.length];
System.arraycopy(array, start, copy, start, end - start + 1);
// 從兩個(gè)子數(shù)組的尾部開(kāi)始遍歷
int i = middle;
int j = end;
int copyIndex = end;
// 記錄逆序?qū)Φ臄?shù)量
int count = 0;
while (i >= start && j >= middle + 1) {
// 數(shù)組是升序的
// 如果左邊數(shù)組比右邊數(shù)組大,則將大的放入存儲(chǔ)數(shù)組中
// 并且累加逆序?qū)Γ瑧?yīng)為是有序的,所以左邊數(shù)組的第i個(gè)元素比第j個(gè)及其之前的數(shù)都大
if (array[i] > array[j]) {
copy[copyIndex--] = array[i--];
count += (j - middle);
} else {
copy[copyIndex--] = array[j--];
}
}
// 將子數(shù)組剩余的部分一次寫(xiě)入歸并后的存儲(chǔ)數(shù)組
while (i >= start) {
copy[copyIndex--] = array[i--];
}
while (j >= middle + 1) {
copy[copyIndex--] = array[j--];
}
// 將本次兩個(gè)子數(shù)組的合并寫(xiě)入原數(shù)組中
for (int k = start; k <= end ; k++) {
array[k] = copy[k];
}
return left + right + count;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
-
jmeter接口測(cè)試教程及接口測(cè)試流程詳解(全網(wǎng)僅有)
Jmeter是由Apache公司開(kāi)發(fā)的一個(gè)純Java的開(kāi)源項(xiàng)目,即可以用于做接口測(cè)試也可以用于做性能測(cè)試。本文給大家分享jmeter接口測(cè)試教程及接口測(cè)試流程,感興趣的朋友跟隨小編一起看看吧 2021-12-12
-
Java用三元運(yùn)算符判斷奇數(shù)和偶數(shù)的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了Java用三元運(yùn)算符判斷奇數(shù)和偶數(shù)的簡(jiǎn)單實(shí)現(xiàn),需要的朋友可以參考下 2014-02-02
-
Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與OJ題
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與OJ題,本文章先是對(duì)隊(duì)列進(jìn)行介紹,后又介紹了四道OJ相關(guān)的題目,來(lái)使其深入理解,需要的朋友可以參考下 2023-01-01
-
Java Idea TranslationPlugin翻譯插件使用解析
這篇文章主要介紹了Java Idea TranslationPlugin翻譯插件使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下 2020-04-04
-
Java工作環(huán)境的配置與Eclipse的安裝過(guò)程
這篇文章主要介紹了Java工作環(huán)境的配置與Eclipse的安裝過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下 2021-02-02
-
MySQL數(shù)據(jù)庫(kù)之Purge死鎖問(wèn)題解析
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)之Purge死鎖問(wèn)題解析的相關(guān)資料,需要的朋友可以參考下 2017-11-11
最新評(píng)論
在數(shù)組中的兩個(gè)數(shù)字,如果前面一個(gè)數(shù)字大于后面的數(shù)字,則這兩個(gè)數(shù)字組成一個(gè)逆序?qū)?,例如在?shù)組{7,5,6,4}中,一共存在5對(duì)逆序?qū)Γ謩e是{7,6},{7,5},{7,4},{6,4},{5,4}。輸入一個(gè)數(shù)組,求出這個(gè)數(shù)組中的逆序?qū)Φ目倲?shù)P。并將P對(duì)1000000007取模的結(jié)果輸出。,即輸出P%1000000007。
代碼
解法一
暴力簡(jiǎn)單低效,不會(huì)改變?cè)瓟?shù)組
public static int inversePairs(int[] array) { if (array == null || array.length < 2) { return 0; } int count = 0; for (int i = 0; i < array.length; i++) { for (int j = i + 1; j < array.length; j++) { if (array[i] > array[j]) { count++; } } } return count % 1000000007; }
解法二
利用數(shù)組的歸并排序,高效,但是會(huì)改變?cè)瓟?shù)組
public static int inversePairs2(int[] array) { if (array == null || array.length < 2) { return 0; } int count = mergeSort(array, 0, array.length - 1); return count % 1000000007; } private static int mergeSort(int[] array, int start, int end) { if (start >= end) { return 0; } // 找到數(shù)組的中點(diǎn),分割為兩個(gè)子數(shù)組,遞歸求解 int middle = (start + end) / 2; int left = mergeSort(array, start, middle); int right = mergeSort(array, middle + 1, end); // 存儲(chǔ)歸并后的數(shù)組 int[] copy = new int[array.length]; System.arraycopy(array, start, copy, start, end - start + 1); // 從兩個(gè)子數(shù)組的尾部開(kāi)始遍歷 int i = middle; int j = end; int copyIndex = end; // 記錄逆序?qū)Φ臄?shù)量 int count = 0; while (i >= start && j >= middle + 1) { // 數(shù)組是升序的 // 如果左邊數(shù)組比右邊數(shù)組大,則將大的放入存儲(chǔ)數(shù)組中 // 并且累加逆序?qū)Γ瑧?yīng)為是有序的,所以左邊數(shù)組的第i個(gè)元素比第j個(gè)及其之前的數(shù)都大 if (array[i] > array[j]) { copy[copyIndex--] = array[i--]; count += (j - middle); } else { copy[copyIndex--] = array[j--]; } } // 將子數(shù)組剩余的部分一次寫(xiě)入歸并后的存儲(chǔ)數(shù)組 while (i >= start) { copy[copyIndex--] = array[i--]; } while (j >= middle + 1) { copy[copyIndex--] = array[j--]; } // 將本次兩個(gè)子數(shù)組的合并寫(xiě)入原數(shù)組中 for (int k = start; k <= end ; k++) { array[k] = copy[k]; } return left + right + count; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
jmeter接口測(cè)試教程及接口測(cè)試流程詳解(全網(wǎng)僅有)
Jmeter是由Apache公司開(kāi)發(fā)的一個(gè)純Java的開(kāi)源項(xiàng)目,即可以用于做接口測(cè)試也可以用于做性能測(cè)試。本文給大家分享jmeter接口測(cè)試教程及接口測(cè)試流程,感興趣的朋友跟隨小編一起看看吧2021-12-12Java用三元運(yùn)算符判斷奇數(shù)和偶數(shù)的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了Java用三元運(yùn)算符判斷奇數(shù)和偶數(shù)的簡(jiǎn)單實(shí)現(xiàn),需要的朋友可以參考下2014-02-02Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與OJ題
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與OJ題,本文章先是對(duì)隊(duì)列進(jìn)行介紹,后又介紹了四道OJ相關(guān)的題目,來(lái)使其深入理解,需要的朋友可以參考下2023-01-01Java Idea TranslationPlugin翻譯插件使用解析
這篇文章主要介紹了Java Idea TranslationPlugin翻譯插件使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Java工作環(huán)境的配置與Eclipse的安裝過(guò)程
這篇文章主要介紹了Java工作環(huán)境的配置與Eclipse的安裝過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02MySQL數(shù)據(jù)庫(kù)之Purge死鎖問(wèn)題解析
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)之Purge死鎖問(wèn)題解析的相關(guān)資料,需要的朋友可以參考下2017-11-11