剑指Offer34 数组中的逆序对

 1 /*************************************************************************
 2     > File Name: 34_InversePairsInArray.c
 3     > Author: Juntaran
 4     > Mail: [email protected]
 5     > Created Time: 2016年09月02日 星期五 20时05分05秒
 6  ************************************************************************/
 7
 8 #include <stdio.h>
 9 #include <malloc.h>
10
11 int InversePairsCore(int* nums, int* copy, int left, int right)
12 {
13     if (left == right)
14     {
15         copy[left] = copy[right];
16         return 0;
17     }
18     int newlength = (right - left) / 2;
19
20     // 递归
21     int leftCount  = InversePairsCore(copy, nums, left, left+newlength);
22     int rightCount = InversePairsCore(copy, nums, left+newlength+1, right);
23
24     // i初始化为前半段最后一个数字下标
25     int i = left + newlength;
26     // j初始化为后半段最后一个数字下标
27     int j = right;
28
29     int indexCopy = right;
30     int count = 0;
31
32     while (i>=left && j>=left+newlength+1)
33     {
34         if (nums[i] > nums[j])
35         {
36             copy[indexCopy--] = nums[i--];
37             count += j - left - newlength;
38         }
39         else
40         {
41             copy[indexCopy--] = nums[j--];
42         }
43     }
44
45     for (i; i >= left; --i)
46         copy[indexCopy--] = nums[i];
47     for (j; j>=left+newlength+1; --j)
48         copy[indexCopy--] = nums[j];
49
50     return leftCount + rightCount + count;
51 }
52
53 int InversePairs(int* nums, int length)
54 {
55     if (nums==NULL || length<=0)
56         return -1;
57
58     int* copy = (int*)malloc(sizeof(int)*length);
59     for (int i = 0; i < length; ++i)
60         copy[i] = nums[i];
61
62     int count = InversePairsCore(nums, copy, 0, length-1);
63     delete[] copy;
64
65     return count;
66 }
67
68 int main()
69 {
70     int nums[] = {7,5,6,4};
71     int length = 4;
72     int ret = InversePairs(nums, length);
73     printf("%d\n", ret);
74 }
时间: 2024-10-22 06:37:19

剑指Offer34 数组中的逆序对的相关文章

剑指offer 数组中的逆序对

题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 示例1 输入 1,2,3,4,5,6,7,0 输出 7 思路:归并排序的思路.具体参考剑指

剑指offer_数组中的逆序对

题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P. 并将P对1000000007取模的结果输出. 即输出P%1000000007 本题采用归并排序,归并排序算法我在前一篇博客里写到过,在那个基础上进行修改即可!(强烈建议先理解归并排序的具体算法后,再来做此题) public class Solution36 { private int count = 0; //记录次数 private int[] copy ;

剑指offer——数组中的逆序对

数组中的逆序对 **(不会)数据结构--小和问题 逆序对问题 原文地址:https://www.cnblogs.com/SkyeAngel/p/8978980.html

剑指offer-数组中的逆序对-数组-python

题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 class Solution: def InversePairs(self, data):

剑指offer (36) 数组中的逆序对

题目:在数组中的两个数字如果前面一个数字大于后面一个数字,则这两个数字组成一个逆序对 题解分析: 首先应该想到很简单的一种解法,顺序遍历数组,对每个数,逐个比较该数字和其以后的数字,T(n) = O(n^2) (1)总体的意思就是将数组分成两段,首先求段内的逆序对数量,比如下面两段代码就是求左右两端数组段内的逆序对数量 count += Merge(data, temp, first, mid);//找左半段的逆序对数目 count += Merge(data, temp, mid + 1, e

【剑指offer】数组中的逆序对

# @left part: [start, mid] # @right part: (mid, end] def merge(data, start, mid, end): if mid < start or end < mid: return 0 reverse = 0 ''' @ for start, it play as the start index of left part, and mid @ play as the end index of left part; @ mid +

剑指Offer 面试题36:数组中的逆序对及其变形(Leetcode 315. Count of Smaller Numbers After Self)题解

剑指Offer 面试题36:数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 例如, 在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4),输出5. 提交网址: http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188 或 htt

【Java】 剑指offer(51)数组中的逆序对

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路 如果遍历数组,对每个数字都和后面的数字比较大小,时间复杂度为O(n^2),效率太低. 利用归并排序的思想,先将数组分解成为n个长度为1的子数组,然后进行两两合并同时排好顺序. 在对两个子区域合并排序时,记左边区域(下标为start~mid)的指针

剑指offer系列——35.数组中的逆序对??

Q:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 示例1 输入: 1,2,3,4,5,6,7,0 输出: 7 T:引用:https://blog.