《剑指offer》第五十一题(数组中的逆序对)
// 面试题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》第五十一题(数组中的逆序对)的更多相关文章
- 《剑指offer》面试题51. 数组中的逆序对
问题描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5 限制: ...
- 剑指Offer(三十五):数组中的逆序对
剑指Offer(三十五):数组中的逆序对 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...
- Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)
剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...
- [简单-剑指 Offer 53 - I. 在排序数组中查找数字 I]
[简单-剑指 Offer 53 - I. 在排序数组中查找数字 I] 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出 ...
- 剑指 Offer 53 - I. 在排序数组中查找数字 I + 二分法
剑指 Offer 53 - I. 在排序数组中查找数字 I Offer_53_1 题目描述 方法一:使用HashMap package com.walegarrett.offer; /** * @Au ...
- 力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I
题目 剑指 Offer 53 - I. 在排序数组中查找数字 I 思路1 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录target数组出现的次数,但是这样的时间复杂度是O(n),还是 ...
- 【剑指Offer】数字在排序数组中出现的次数 解题报告(Python)
[剑指Offer]数字在排序数组中出现的次数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interv ...
- 【Java】 剑指offer(53-1) 数字在排序数组中出现的次数
正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 统计一个数字在排序数组中出现的次数.例如输入排序数组{1, ...
- 剑指offer(一):二维数组中的查找
说明: 1.本系列是根据<剑指Offer>这个系列做的一个小笔记. 2.直接动力是因为师兄师姐找工作很难,而且机械出生的我面试算法更难. 3.刚开始准备刷LeetCode.LintCode ...
- Go语言实现:【剑指offer】数字在排序数组中出现的次数
该题目来源于牛客网<剑指offer>专题. 统计一个数字在排序数组中出现的次数. 看到排序数组,要想到用二分查找. 先找到最前面的数字k,再找到最后面的数字k,通过下标求出次数. Go语言 ...
随机推荐
- bzoj 3083
bzoj 3083 树链剖分,换根 对于一颗树有以下操作 1.确定x为根,2.将u到v的简单路径上的数全改成c,3.询问当前以x为根的子树中的节点最小权值. 如果没有操作1:树链剖分很明显. 于是考虑 ...
- Percona Server 5.6 安装TokuDB
系统:Red Hat Enterprise Linux Server release 6.3 (Santiago) 数据库:Percona-Server-5.6.29-rel76.2-Linux.x8 ...
- maven maven.compiler.source和maven.compiler.target的坑
最近建议产品组把jdk 1.7升级到1.8,昨晚开发报了个问题过来,说maven.compiler.source和maven.compiler.target改成1.8之后,编译出来的代码还是1.7,如 ...
- rabbitmq集群故障恢复详解
RabbitMQ的mirror queue(镜像队列)机制是最简单的队列HA方案,它通过在cluster的基础上增加ha-mode.ha-param等policy选项,可以根据 需求将cluster中 ...
- py4CV例子2汽车检测和svm算法
1.什么是汽车检测数据集: ) pos, neg = , ) matcher = cv2.FlannBasedMatcher(flann_params, {}) bow_kmeans_trainer ...
- Bugku-CTF之web2-听说聪明的人都能找到答案
Day1 听说聪明的人都能找到答案 http://123.206.87.240:8002/yanzhengma/
- tf.nn.relu
tf.nn.relu(features, name = None) 这个函数的作用是计算激活函数 relu,即 max(features, 0).即将矩阵中每行的非最大值置0. import tens ...
- mtr 命令
mtr命令的使用: -r --report 以报告的方式发布监测的结果 -s 30 指定发送包的大小 这个随意 按照自己的需求 -i 10 设置icmp协议返回包的时间 -n no- ...
- Python3 tkinter基础 Label justify 多行字符串左对齐
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 记一次oracle创建一个新数据库,并导入正式环境数据库备份的dmp包过程
背景:正式环境oracle数据库定时用exp备份一个dmp包,现在打算在一台机器上创建一个新数据库,并导入这个dmp包. 1.创建数据库 开始 -> 所有程序 -> Oracle -> ...