《剑指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语言 ...
随机推荐
- AirTest源码分析之运行器
from: https://blog.csdn.net/u012897401/article/details/82900562 使用:根据airtest文档说明,可以通过命令行来启动air脚本,需要传 ...
- No module named scrapy 成功安装scrapy,却无法import的解决方法
今天本来准备写一个Python的爬虫,然而使用pip安装了Scrapy之后,却无论如何也无法import,显示的结果总是ImportError: No module named Scrapy.网上查阅 ...
- Vue小案例 之 商品管理------删除商品与提示
实现删除商品功能 根据索引来进行删除商品: 实现删除商品的HTML: <!--显示表格--> <div class="table-warp"> <di ...
- mvc 前端校验
首先解决 Ajax.BeginFor异步提交表单,给表单添加样式的问题.不能直接用class属性,网上找了很多都是用ClassName,经过测试不管用,看源代码发现生成的是ClassName而非cla ...
- vue2.0子组件修改父组件props数据的值
从vue1.0升级至2.0之后 prop的.sync被去除 因此直接在子组件修改父组件的值是会报错的如下: 目的是为了阻止子组件影响父组件的数据那么在vue2.0之后 如何在子组件修改父组件props ...
- yolo3(目标检测)实测
yolo是继faster-r-cnn后,原作者在目标检测领域进行的新研究.到了v3版本以后,虽然已经换人支持,但是更注重工程实践,在实际使用过程中突出感受就是 “非常快”,GPU加速以后能够达到实时多 ...
- Flutter 第一次运行就出现白屏的问题
--enable-software-rendering 解决办法: 顶部菜单找到 run-->Edit Configurations 中加这么一句:
- 编译openwrt时总是报错“staging_dir/target-aarch64_generic_glibc/stam$/.tools_compile_yynyyyyynyyyyynyynnyyyynyyyyyyyyyyyyyyynyynynnyyynny' failed”
1. 详细错误如下: tools/Makefile:146: recipe for target '/home/jello/openwrt/staging_dir/target-aarch64_gen ...
- Oracle联合多个子查询(inner join)
select aaa.*,bbb.xh from (select xn,xq,kcdm,kcmc,xf,xkkh,kcxz from jxrwbview where xn='2017-2018' gr ...
- Restructure output of R summary function
Treat it as a data.frame: set.seed(1)x <- sample(30, 100, TRUE) summary(x)# Min. 1st Qu. Medi ...