JZ-C-36

剑指offer第三十六题:数组中的逆序对

  1 //============================================================================
  2 // Name        : JZ-C-36.cpp
  3 // Author      : Laughing_Lz
  4 // Version     :
  5 // Copyright   : All Right Reserved
  6 // Description : 数组中的逆序对
  7 //============================================================================
  8
  9 #include <iostream>
 10 #include <stdio.h>
 11 using namespace std;
 12
 13 int InversePairsCore(int* data, int* copy, int start, int end);
 14
 15 /**
 16  *统计逆序对的过程:先把数组分隔成子数组,1:先统计出子数组内部的逆序对的数目,
 17  *2:然后再统计出两个相邻子数组之间的逆序对数目。★在统计逆序对的过程中,还需要对数组进行排序(归并排序)
 18  */
 19 int InversePairs(int* data, int length) {
 20     if (data == NULL || length < 0)
 21         return 0;
 22
 23     int* copy = new int[length];
 24     for (int i = 0; i < length; ++i)
 25         copy[i] = data[i];
 26
 27     int count = InversePairsCore(data, copy, 0, length - 1);
 28     delete[] copy;
 29
 30     return count;
 31 }
 32 /**
 33  *类似归并排序,每次递归拆分为两个子数组,缩小为两个单元素时候比较大小获得count逆序对数,最后再缩小为同一个元素时候返回。
 34  */
 35 int InversePairsCore(int* data, int* copy, int start, int end) {
 36     if (start == end) {
 37         copy[start] = data[start];
 38         return 0; //最后缩小为同一个元素,直接返回
 39     }
 40
 41     int length = (end - start) / 2;
 42
 43     int left = InversePairsCore(copy, data, start, start + length); //注意此处参数:copy,data,交换的原因在于需要对子数组进行排序(归并)。
 44     int right = InversePairsCore(copy, data, start + length + 1, end);
 45
 46     // i初始化为前半段最后一个数字的下标
 47     int i = start + length;
 48     // j初始化为后半段最后一个数字的下标
 49     int j = end;
 50     int indexCopy = end;
 51     int count = 0; //count为被拆两个子数组相比较得出的逆序对数
 52     while (i >= start && j >= start + length + 1) {
 53         if (data[i] > data[j]) {
 54             copy[indexCopy--] = data[i--];
 55             count += j - start - length;
 56         } else {
 57             copy[indexCopy--] = data[j--];
 58         }
 59     }
 60
 61     for (; i >= start; --i)
 62         copy[indexCopy--] = data[i];
 63
 64     for (; j >= start + length + 1; --j)
 65         copy[indexCopy--] = data[j];
 66
 67     return left + right + count;
 68 }
 69
 70 // ====================测试代码====================
 71 void Test(char* testName, int* data, int length, int expected) {
 72     if (testName != NULL)
 73         printf("%s begins: ", testName);
 74
 75     if (InversePairs(data, length) == expected)
 76         printf("Passed.\n");
 77     else
 78         printf("Failed.\n");
 79 }
 80
 81 void Test1() {
 82     int data[] = { 1, 2, 3, 4, 7, 6, 5 };
 83     int expected = 3;
 84
 85     Test("Test1", data, sizeof(data) / sizeof(int), expected);
 86 }
 87
 88 // 递减排序数组
 89 void Test2() {
 90     int data[] = { 6, 5, 4, 3, 2, 1 };
 91     int expected = 15;
 92
 93     Test("Test2", data, sizeof(data) / sizeof(int), expected);
 94 }
 95
 96 // 递增排序数组
 97 void Test3() {
 98     int data[] = { 1, 2, 3, 4, 5, 6 };
 99     int expected = 0;
100
101     Test("Test3", data, sizeof(data) / sizeof(int), expected);
102 }
103
104 // 数组中只有一个数字
105 void Test4() {
106     int data[] = { 1 };
107     int expected = 0;
108
109     Test("Test4", data, sizeof(data) / sizeof(int), expected);
110 }
111
112 // 数组中只有两个数字,递增排序
113 void Test5() {
114     int data[] = { 1, 2 };
115     int expected = 0;
116
117     Test("Test5", data, sizeof(data) / sizeof(int), expected);
118 }
119
120 // 数组中只有两个数字,递减排序
121 void Test6() {
122     int data[] = { 2, 1 };
123     int expected = 1;
124
125     Test("Test6", data, sizeof(data) / sizeof(int), expected);
126 }
127
128 // 数组中有相等的数字
129 void Test7() {
130     int data[] = { 1, 2, 1, 2, 1 };
131     int expected = 3;
132
133     Test("Test7", data, sizeof(data) / sizeof(int), expected);
134 }
135
136 void Test8() {
137     int expected = 0;
138
139     Test("Test8", NULL, 0, expected);
140 }
141
142 int main(int argc, char** argv) {
143     Test1();
144     Test2();
145     Test3();
146     Test4();
147     Test5();
148     Test6();
149     Test7();
150     Test8();
151
152     return 0;
153 }
时间: 2024-08-29 10:07:07

JZ-C-36的相关文章

[芯片] 4、接口技术&#183;实验四&#183;串行接口8251A

目录 一.实验目的和要求... 2 二.实验原理与背景... 3 三.实验具体的内容... 3 四.实验的代码说明... 4 五.实验结果的分析... 6 附录资料 一.实验目的和要求 学会8251芯片和微机接口原理和方法. 掌握8251串口芯片的基本工作原理.工作方式和编程原理. 二.实验原理与背景 TPC-USB平台上有一块8251A串行接口芯片,除了片选引脚,其他信号都已接好. 三.实验具体的内容 从键盘输入一个字符,将其ASCII码加 1 后串行发送出去,再从串行口接收回来在屏幕上显示,

什么值得买:一家论坛式导购网站的自我修养

什么值得买 的用户把这个网站亲切称为"色魔张大妈"(SMZDM演化而来),虽然这个昵称有些恶搞的成分,但这是一家我印象中这个时代为数不多的"正常"公司.它没有颠覆什么,但重新定义了什么是"值",并且改变了一大批人的消费习惯. 在电商领域,什么值得买从创立初始就在节奏与气质上特立独行,包括其至今都没有涉及"交易"环节.电商行业里,如果一家公司不擅长赶政策热点.赶创业故事热潮,很难在资本市场为自己谈到一个好价钱,没钱烧就没有资源支

adb server version (31) doesn’t match this client (36); killing… 的解决方法

今天折腾了一下Android studio,好不容易搞完了,结果在运行adb命令的时候出错了 不要着急,我们先看下这个错误是怎么出现的. 1.搞完Android studio之后也升级使用了新的sdk,并配置了环境变量 2.启动了第三方模拟器 3.之后用adb devices命令就出现了上图的错误 从报错的原因来看应该是版本不一致导致的,大概的意思是说你现在的adb版本是31,但是你client端的却是36(这里的client端我猜就是第三方的模拟器)不匹配啊. 尝试解决下,既然版本不一致,那就

《电脑报》2017年第36期

下载地址: 电脑报 17年第36期.pdf

cogs 36.求和问题

36. 求和问题 ★   输入文件:sum.in   输出文件:sum.out   简单对比时间限制:1.2 s   内存限制:128 MB [问题描述] 在一个长度为n的整数数列中取出连续的若干个数,并求它们的和. [输入格式] 输入由若干行组成,第一行有一个整数n    第二行有n个整数    第三行有一个整数m    下面m行,每行两个整数i与j(i<=j),表示求和的起始和终止位置. [输出格式] 输出有m行, 每行一个整数,表示这个数段数列的和. [输入样例] 输入文件 82 3 4

彩票生成器--36选7(不重复)

import java.util.Random; public class suijishu { /** * @param args */ public static void main(String[] args) { // TODO 自动生成的方法存根 //36选7,不重复 //第一步,初始化 定义数组,建随机数组生成器 int []caiPiao=new int[7]; Random ran = new Random(); //第二步,生成 //随机生成7个数 for(int i=0;i<

第一套36

#include<stdio.h> struct S{int n;int a[20];}; void f(struct S *p) { int i,j,t; for(i=0;i<p->n-1;i++) for(j=i+1;j<p->n;j++) if(p->a[i]>p->a[j]) { t=p->a[i]; p->a[i]=p->a[j]; p->a[j]=t; } } main() { int i; struct S s={

益计算Shprotification.v6.8.15.22+Heat.Balance.v6.12.27.36+Cold.Balance.v2.6.14.18

热增益计算Shprotification.v6.8.15.22+Heat.Balance.v6.12.27.36+Cold.Balance.v2.6.14.18 Andrey.Shirshov.Shprotification.v6.8.15.22 Andrey.Shirshov.Heat.Balance.v6.12.27.36 Andrey.Shirshov.Cold.Balance.v2.6.14.18   "现代ASHRAE标准参考数据用于从人.设备.确定热输入的人工照明,半透明的击剑系数(

使用percona-xtrabackup-2.0.8将MySQL从5.1.73升级到5.6.36

1.安装xtrabackup cd /usr/local/ tar xvf percona-xtrabackup-2.0.8-587.tar.gz mv percona-xtrabackup-2.0.8 xtrabackup vim /root/.bash_profile PATH=$PATH:$HOME/bin:/usr/local/xtrabackup/bin source /root/.bash_profile 2.全量备份mysql 5.1.73数据库 innobackupex --us

Win32 汇编 - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

跳转指令分三类:一.无条件跳转: JMP;二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转);三.根据 EFLAGS 寄存器的标志位跳转, 这个太多了. 根据标志位跳转的指令: JE ;等于则跳转 JNE ;不等于则跳转 JZ ;为 0 则跳转 JNZ ;不为 0 则跳转 JS ;为负则跳转 JNS ;不为负则跳转 JC ;进位则跳转 JNC ;不进位则跳转 JO ;溢出则跳转 JNO ;不溢出则跳转 JA ;无符号大于则跳转 JNA