// 面试题51:数组中的逆序对
// 题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组
// 成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 #include <iostream>
using namespace std; int InversePairsCore(int* data, int* copy, int start, int end); int InversePairs(int* data, int length)
{
if (data == nullptr || length < )//检测无效输入
return ; int* copy = new int[length];//复制原数组
for (int i = ; i < length; ++i)
copy[i] = data[i]; int count = InversePairsCore(data, copy, , length - );
delete[] copy; return count;
} int InversePairsCore(int* data, int* copy, int start, int end)//注意这里输入,永远是data去更新copy
{
if (start == end)
{
copy[start] = data[start];
return ;
} int length = (end - start) / ; int left = InversePairsCore(copy, data, start, start + length);//然后将实参copy给形参data传参,最后copy数组完成归并排序,而原数组也被改变了
int right = InversePairsCore(copy, data, start + length + , end); // i初始化为前半段最后一个数字的下标
int i = start + length;
// j初始化为后半段最后一个数字的下标
int j = end;
int indexCopy = end;
int count = ;
while (i >= start && j >= start + length + )//分别从两段的尾巴朝头走
{
if (data[i] > data[j])//如果前面的大于后面的
{
copy[indexCopy--] = data[i--];//赋值
count += j - start - length;//逆序对个数加上j下标距离它所处的小段开头的距离,具体看书中推导,抛开这句和return内容,这就是归并排序
}
else
{
copy[indexCopy--] = data[j--];//后面大于前面,只用赋值,不属于逆序对情况
}
} for (; i >= start; --i)//万一j下标所处的段里元素比i的多,剩余的i段里的值直接复制
copy[indexCopy--] = data[i]; for (; j >= start + length + ; --j)//情况和上面的相反
copy[indexCopy--] = data[j]; return left + right + count;
} // ====================测试代码====================
void Test(const char* testName, int* data, int length, int expected)
{
if (testName != nullptr)
printf("%s begins: ", testName); if (InversePairs(data, length) == expected)
printf("Passed.\n");
else
printf("Failed.\n");
} void Test1()
{
int data[] = { , , , , , , };
int expected = ; Test("Test1", data, sizeof(data) / sizeof(int), expected);
} // 递减排序数组
void Test2()
{
int data[] = { , , , , , };
int expected = ; Test("Test2", data, sizeof(data) / sizeof(int), expected);
} // 递增排序数组
void Test3()
{
int data[] = { , , , , , };
int expected = ; Test("Test3", data, sizeof(data) / sizeof(int), expected);
} // 数组中只有一个数字
void Test4()
{
int data[] = { };
int expected = ; Test("Test4", data, sizeof(data) / sizeof(int), expected);
} // 数组中只有两个数字,递增排序
void Test5()
{
int data[] = { , };
int expected = ; Test("Test5", data, sizeof(data) / sizeof(int), expected);
} // 数组中只有两个数字,递减排序
void Test6()
{
int data[] = { , };
int expected = ; Test("Test6", data, sizeof(data) / sizeof(int), expected);
} // 数组中有相等的数字
void Test7()
{
int data[] = { , , , , };
int expected = ; Test("Test7", data, sizeof(data) / sizeof(int), expected);
} void Test8()
{
int expected = ; Test("Test8", nullptr, , expected);
} int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
Test8();
system("pause");
return ;
}

《剑指offer》第五十一题(数组中的逆序对)的更多相关文章

  1. 《剑指offer》面试题51. 数组中的逆序对

    问题描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5   限制: ...

  2. 剑指Offer(三十五):数组中的逆序对

    剑指Offer(三十五):数组中的逆序对 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...

  3. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

  4. [简单-剑指 Offer 53 - I. 在排序数组中查找数字 I]

    [简单-剑指 Offer 53 - I. 在排序数组中查找数字 I] 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出 ...

  5. 剑指 Offer 53 - I. 在排序数组中查找数字 I + 二分法

    剑指 Offer 53 - I. 在排序数组中查找数字 I Offer_53_1 题目描述 方法一:使用HashMap package com.walegarrett.offer; /** * @Au ...

  6. 力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I

    题目 剑指 Offer 53 - I. 在排序数组中查找数字 I 思路1 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录target数组出现的次数,但是这样的时间复杂度是O(n),还是 ...

  7. 【剑指Offer】数字在排序数组中出现的次数 解题报告(Python)

    [剑指Offer]数字在排序数组中出现的次数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interv ...

  8. 【Java】 剑指offer(53-1) 数字在排序数组中出现的次数

    正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 统计一个数字在排序数组中出现的次数.例如输入排序数组{1, ...

  9. 剑指offer(一):二维数组中的查找

    说明: 1.本系列是根据<剑指Offer>这个系列做的一个小笔记. 2.直接动力是因为师兄师姐找工作很难,而且机械出生的我面试算法更难. 3.刚开始准备刷LeetCode.LintCode ...

  10. Go语言实现:【剑指offer】数字在排序数组中出现的次数

    该题目来源于牛客网<剑指offer>专题. 统计一个数字在排序数组中出现的次数. 看到排序数组,要想到用二分查找. 先找到最前面的数字k,再找到最后面的数字k,通过下标求出次数. Go语言 ...

随机推荐

  1. PyTorch 常用方法总结1:生成随机数Tensor的方法汇总(标准分布、正态分布……)

    在使用PyTorch做实验时经常会用到生成随机数Tensor的方法,比如: torch.rand() torch.randn() torch.normal() torch.linespace() 在很 ...

  2. Linux学习笔记之查看Linux版本信息

    0x00 概述 这里所谓的Linux版本信息,包括Linux内核版本信息和Linux系统版本信息. 0x01 查看Linux内核版本信息 方法1:登陆Linux,在终端输入 cat /proc/ver ...

  3. php 数字变汉字

    //数字变汉字 function getTheWord($num) { $arr_n = array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九', ...

  4. mysql "The user specified as a definer ('root'@'%') does not exist" 问题

    在重配mysql的时候碰到, 解决办法: 重新授权 grant all privileges on *.* to root@"%" identified by ".&qu ...

  5. 安装kali linux 2017.1 【一、更新源 升级软件和内核等】

    呃,我这次安装是在VMware WorkStation里进行的,具体操作系统安装步骤不谈. ISO文件下载地址:https://www.kali.org/downloads/ 说下安装后的升级操作.下 ...

  6. git download error processing

    git clone git@github.com:happyfish100/fastdfs.git 提示下列信息: Warning: Permanently added 'github.com,192 ...

  7. Ubuntu + CUDA9 + CUDNN7 + OpenCV3.4 + contrib +CAFFE-master

    安装ubuntu时赞美Rufus(建议ubuntu16.04.04),过程参考 https://www.cnblogs.com/willnote/p/6725594.html 安 装 前 一 定 要 ...

  8. 【python51--__name__属性】

    一.基础知识 1.__name__ == '__main__' 所有模块都有一个__name__属性,__name__的值取决于如何应用模块,在作为独立程序运行的时候,__name__属性的值是‘__ ...

  9. 16 级高代 II 思考题九的七种解法

    16 级高代 II 思考题九  设 $V$ 是数域 $\mathbb{K}$ 上的 $n$ 维线性空间, $\varphi$ 是 $V$ 上的线性变换, $f(\lambda),m(\lambda)$ ...

  10. topcoder srm 701 div1 -3

    1.一堆石子有$n$个,Alice,Bob轮流拿,给定每个人每次可以拿的石子的数目的集合.谁先不能拿谁输.问谁能赢? 思路:对于先手来说,输赢的局面一定是从某个数字开始呈循环状态.所以找到这个循环开始 ...