日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

剑指offer之数组中的逆序对

發(fā)布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指offer之数组中的逆序对 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 問題

在數(shù)組中的兩個數(shù)字,如果前面一個數(shù)字大于后面的數(shù)字,則這兩個數(shù)字組成一個逆序?qū)Α]斎胍粋€數(shù)組,求出這個數(shù)組中的逆序?qū)Φ目倲?shù)P。并將P對1000000007取模的結(jié)果輸出。 即輸出P%1000000007。

比如數(shù)列{6,202,100,301,38,8,1},有14個序列對;

比如數(shù)列{7, 5, 6, 4},有5個序列對{7,5},{7,6},{7,4},{5,4},{6,4};

?

?

?

?

?

?

2 分析

我們先了解下歸并排序,前面博客有介紹??劍指offer之歸并排序?,我們分析數(shù)列{6,202,100,301,38,8,1},

第一次歸并后:{6,202},{100,301},{8,38},{1},這里逆序?qū)?對,就是我們把8插入了38前面,后面只有38一個數(shù)據(jù),所以是一度

第二次歸并后:{6,100,202,301},{1,8,38},這里逆序?qū)τ?對,我們把100插入了數(shù)組{6,202}之間,后面只有202一個元素,所以有一對逆序?qū)?#xff0c;然后1插入了數(shù)組{8, 38}最前面,這里后面還有2個元素,所以這有2個逆序?qū)Α?/p>

第三次歸并后:{1,6,8,38,100,202,301},這里逆序?qū)τ?0對,把1出入了數(shù)組{6,100,202,301}最前面,后面有4個數(shù)據(jù),所以4對,然后把8插入數(shù)組{6,100,202,301}的第二個數(shù)據(jù),后面還有3個數(shù)據(jù),就是3對,然后再把38插入數(shù)組{6,100,202,301}里面,后面還有3個數(shù)據(jù),也就是還有3對逆序?qū)?/p>

規(guī)律:我們把右邊數(shù)組里面的元素插入左邊數(shù)組元素的時候,插進去的位置后面到左邊數(shù)組尾巴多有多少個元素,就有多少個逆序?qū)?#xff0c;每插入依次,我們統(tǒng)計一次,依次累加。

?

?

?

?

?

?

3 代碼實現(xiàn)

#include <stdio.h>int lastResult = 0;void merge(int* source, int* temp, int start, int mid, int end) {if (source == NULL || temp == NULL){printf("merge source or temp is NULL\n");return;}int i = start, j = mid + 1, k = start;int count = 0;while (i != mid + 1 && j != end + 1){if (source[i] > source[j]){temp[k++] = source[j++];count = mid - i + 1;lastResult += count;}elsetemp[k++] = source[i++];}while (i != mid + 1)temp[k++] = source[i++];while (j != end + 1)temp[k++] = source[j++];for(int h = start; h <= end; ++h){source[h] = temp[h]; }return; }int static result = 0;void mergeSort(int* source, int* temp, int start, int end) {if (source == NULL || temp == NULL){printf("mergeSort source or temp is NULL\n");return;}if (start < end){int mid = start + (end - start) / 2;mergeSort(source, temp, start, mid);mergeSort(source, temp, mid + 1, end);merge(source, temp, start, mid, end);} }void printDatas(int* datas, int len) {for (int i = 0; i < len; ++i){printf("%d\t", datas[i]);}printf("\n"); }int main(void) { int source[] = {7, 5, 6, 4};int temp[4];int length = sizeof(source) / sizeof(int);mergeSort(source, temp, 0, length - 1);printf("lastResult is %d\n", lastResult % 1000000007);return 0; }

?

?

?

?

?

?

4 運行結(jié)果

lastResult is 5

這里時間復(fù)雜度是O(nlogn),如果我們用暴力求解,時間復(fù)雜度就是O(n * n)?.

?

總結(jié)

以上是生活随笔為你收集整理的剑指offer之数组中的逆序对的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。