归并排序-最小和

前面的文章已经讲了归并排序的几种实现,今天来说说通过归并排序来求最小和的问题

首先澄清一下最小和的概念:给定一个数组,对于数组中的每个元素,把它前面所有比它小的元素全部加起来生成一个小和,然后把每个元素对应的小和全部加起来生成整个数组的一个小和,比如给定数组{3, 2, 2, 4, 1, 5},每个元素对应的小和是{0,0,0,7,0,12},整个数组的小和就是19

首先我们常规的思路就是两个for循环,简单粗暴,但是时间复杂度不太行(O(N的平方)),也就是下面的代码:

    private int smallSum(int[] array) {int length = array.length;int sum = 0;for (int i = 0; i < length; i++) {for (int j = 0; j < i; j++) {if (array[j] < array[i]) {sum += array[j];}}}return sum;}

那么怎么利用归并排序来实现呢,我们知道归并排序的核心思想是把数组切分成两个子数组进行merge(这两个子数组内部肯定是有序的,至于为什么,去看看归并排序的代码实现就知道了),分别有两个指针指向每个数组的起始位置,移动指针比较,然后借助一个临时数组拷贝数据,来完成数据的排序,在拷贝数据的时候就有一个很重要的依据:谁小就拷贝谁,于是我们可以考虑从这个地方着手:如果左边数组当前指针指向的数据小于右边的数组当前指针指向的数据,那么就将左边的数组当前指针对应的的数据累加起来并返回累加的结果,但是这里有个很重要的逻辑就是左边的数组当前指针对应的的数据要累加多次,次数就是右边数组当前指针到数组结尾的数据的个数,下面我来解释一下为什么:

就拿题目中的数组{3, 2, 2, 4, 1, 5}来说,我们从另外一个角度来思考,就是对于每一个元素来说,自己在计算最终结果的时候要加几次,这个几次也就是上面提到的累加多次

比如对于3来说,后面比它大的只有后边的4和5,那么3一定会在最终的结果中累加2次,也就是3*2

对于第一个2来说,后面比它大的只有后边的4和5,那么这个2一定会在最终的结果中累加2次,也就是2*2

对于第二个2来说,后面比它大的只有后边的4和5,那么这个2一定会在最终的结果中累加2次,也就是2*2

对于4来说,后面比它大的只有后边的5,那么4一定会在最终的结果中累加1次,也就是4*1

对于1来说,后面比它大的只有后边的5,那么1一定会在最终的结果中累加1次,也就是1*1

对于5来说,后面比它大的没有,那么5一定会在最终的结果中累加0次,也就是5*0

那么最终计算结果的公式就是:3*2+2*2+2*2+4*1+1*1+5*0=19

接下来我们对题目中的数组一步步合并的推演:

第一轮合并:

3,2合并为{2,3},局部累加和是0,因为左边比右边大

2,4合并为{2,4},局部累加和是2*1,因为左边比右边小

1,5合并为{1,5},局部累加和是1*1,因为左边比右边小

第二轮合并:

{2,3}和{2,4}合并为{2,2,3,4},局部类累加和为2*1+3*1=5,因为左边的数组{2,3}都比比右边的数组{2,4}中的4要小

第三轮合并:

{2,2,3,4}和{1,5}合并为{1,2,2,3,4,5},局部累加和为2*1+2*1+3*1+4*1=11,因为左边的数组都比右边的数组中的5要小

最终的结果就是:2*1+1*1+2*1+3*1+2*1+2*1+3*1+4*1=19

我们来看代码实现:

private int mergeSort(int[] arr, int start, int end) {if (start == end) {return 0;}int middle = start + ((end - start) >> 1);//第四处return mergeSort(arr, start, middle) +mergeSort(arr, middle + 1, end) +merge(arr, start, middle, end);}private int merge(int[] arr, int start, int middle, int end) {int i = 0;int[] help = new int[end - start + 1];int index1 = start;int index2 = middle + 1;//第一处int sum = 0;while (index1 <= middle && index2 <= end) {//第二处sum += arr[index1] < arr[index2] ? arr[index1] * (end - index2 + 1) : 0;help[i++] = arr[index1] < arr[index2] ? arr[index1++] : arr[index2++];}while (index1 <= middle) {help[i++] = arr[index1++];}while (index2 <= end) {help[i++] = arr[index2++];}int length = help.length;for (int i1 = 0; i1 < length; i1++) {arr[start + i1] = help[i1];}//第三处return sum;}

 大伙儿可以看到在上面的代码中与标准的归并排序做法就是多了//标注的四个地方

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/223774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js 实现图片上传

<style>.showFile{width: 200px;height: 200px;border: 1px solid blue;}.showFile img{width: 100px;height: 100px;} </style> <div><input type"file" id"file" multiple><!--展示所上传的文件--><div class"sho…

java 图片水印、压缩图片、宽和高等比缩放的率

/*** 添加水印* param inputStream 图片文件流* param mark 要打的水印* param rgb 字体颜色&#xff08;白色&#xff09;* param alpha 分辨率* param degree 水印旋转* return*/public static InputStream addMark(InputStream inputStream, String mark,Integer rgb,Floa…

鸿蒙原生应用/元服务开发-Stage模型能力接口(五)

说明 Common模块将二级模块API组织在一起方便开发者进行导出。本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。本模块接口仅可在Stage模型下使用 二、 导入模块 import common from ohos.app.ability.common; 三、 …

K8S学习指南(18)-k8s核心对象configmap

文章目录 前言什么是ConfigMap&#xff1f;示例演示步骤1&#xff1a;创建ConfigMap步骤2&#xff1a;在Pod中使用ConfigMap步骤3&#xff1a;应用变更并验证 高级用法&#xff1a;从文件中创建ConfigMap步骤4&#xff1a;从文件创建ConfigMap步骤5&#xff1a;在Pod中使用文件…

系列五、DQL

一、DQL 1.1、概述 DQL的英文全称为&#xff1a;Data Query Language&#xff0c;中文意思为&#xff1a;数据查询语言&#xff0c;用大白话讲就是查询数据。对于大多数系统来说&#xff0c;查询操作的频次是要远高于增删改的&#xff0c;当我们去访问企业官网、电商网站&…

LeetCode刷题--- 二叉树的所有路径

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 【 http://t.csdnimg.cn/yUl2I 】 【C】 【 http://t.csdnimg.cn/6AbpV 】 数据结构与算法 【 http://t.csdnimg.cn/hKh2l 】 前言&…

Java架构师-数据机构与算法实战(第一篇)

数学知识回顾 指数 指数函数是重要的基本初等函数之一。一般地&#xff0c;ya^x函数(a为常数且以a>0&#xff0c;a≠1)叫做指数函数&#xff0c;函数的定义域是 R 。注意&#xff0c;在指数函数的定义表达式中&#xff0c;在a^x前的系数必须是数1&#xff0c;自变量x必须在…

linux/CentOS 7 安装jdk

安装前准备 下载安装包。下载地址 本文使用的安装包是 jdk-8u211-linux-x64.tar.gz 将 jdk-8u211-linux-x64.tar.gz 放到到服务器上&#xff0c;按需放到对应目录下 安装步骤 #使用普通用户登陆服务器&#xff0c;执行以下安装 解压jdk-8u211-linux-x64.tar.gz tar -xvzf j…

车载测试包括哪些测试

车载测试包括CW测试和现网测试。以下是相关介绍&#xff1a; CW测试&#xff1a; 即在典型区域架设发射天线&#xff0c;发射单载被信号&#xff0c;然后在预先设定的路线上进行车载测试&#xff0c;使用车载接收机接收并记录各处的信号场强。CW测试频率和环境选择方便&#…

MySQL 是什么?

MySQL官方网站&#xff08;http://www.mysql.com/&#xff09;提供关于MySQL软件的最新信息。 MySQL是一个数据库管理系统。 数据库是一种结构化的数据集合。它可以是从简单的购物清单到图片库&#xff0c;再到企业网络中的大量信息等任何形式。要添加、访问和处理存储在计算…

如何拍摄超级大像素图片,超级大像素有哪些应用

引言&#xff1a; 在数字摄影领域&#xff0c;超级大像素照片是指通过高像素的相机或拼接多张照片合成的照片。这样的照片具有更高的分辨率&#xff0c;细节更加清晰&#xff0c;绘画质感更强。那么如何拍摄超级大像素照片&#xff0c;超级大像素可以用在哪些领域呢。 一&…

记一次Android中获取时间戳在Java转字符串不正确的问题

Hi, I’m Shendi 记一次Android中获取时间戳在Java转字符串不正确的问题 问题 在 Java 中将 Android 的时间戳转字符串&#xff0c;发现转换的结果不正确。示例代码如下 Calendar calendar Calendar.getInstance(); calendar.set(Calendar.YEAR, 2023); calendar.set(Calend…

如何做到人均告警减少 90%?B 站新一代告警平台的设计与实践

一分钟精华速览 B 站的业务规模和用户群体不断扩大&#xff0c;对于服务的稳定性和可用性的要求也日益增高。这就需要 B 站的监控告警系统能够及时、准确地发现和定位问题&#xff0c;以便尽快解决&#xff0c;维护好用户的使用体验。 本文是对 B 站在告警监控系统上的一次重…

小红书可观测 Metrics 架构演进,如何实现数十倍性能提升?

在当前云原生时代&#xff0c;随着微服务架构的广泛应用&#xff0c;云原生可观测性概念被广泛讨论。可观测技术建设&#xff0c;将有助于跟踪、了解和诊断生产环境问题&#xff0c;辅助开发和运维人员快速发现、定位和解决问题&#xff0c;支撑风险追溯、经验沉淀、故障预警&a…

MATLAB图解傅里叶变换(初学者也可以理解)

1、概述 相信很多人对于傅里叶变换可能觉得比较复杂和有点难懂&#xff0c;其实不难&#xff0c;它只是一种积分变换。 傅里叶变换&#xff0c;表示能将满足一定条件的某个函数表示成三角函数&#xff08;正弦和/或余弦函数&#xff09;或者它们的积分的线性组合。也就是说&qu…

『 Linux 』进程地址空间概念

文章目录 &#x1fad9; 前言&#x1fad9; 进程地址空间是什么&#x1fad9; 写时拷贝&#x1fad9; 可执行程序中的虚拟地址&#x1fad9; 物理地址分布方式 &#x1fad9; 前言 在c/C中存在一种内存的概念; 一般来说一个内存的空间分布包括栈区,堆区,代码段等等; 且内存是…

Notes2024节气和日历来了

大家好&#xff0c;才是真的好。 还有三周就是2024年了。 2024的节假日安排其实早就发布&#xff0c;有些人已经把这些节假日安排都写在自己的日历上了&#xff1b;同时我们这里也设置了一份&#xff0c;包括节假日和农历二十四节气以及中西传统的节日日期等。 如果你需要的…

均匀分布的随机变量

如果连续型随机变量的概率密度满足如下公式&#xff1a; 那么就称在区间(a,b)上服从均匀分布&#xff0c;记为。

国际语音呼叫中心有什么功能特点?

国际语音呼叫中心的功能特点 智能客服 国际语音呼叫中心通过智能客服系统&#xff0c;可以为客户提供快捷、高效的服务。可以根据客户需求&#xff0c;自动回答部分常见问题&#xff0c;提高客户服务效率。 个性化定制 国际语音呼叫中心平台可以根据客户需求&#xff0c;为…

el-tree搜索的使用

2023.12.11今天我学习了如何对el-tree进行搜索的功能&#xff0c;效果如下&#xff1a; 代码如下&#xff1a; 重点部分&#xff1a;给el-tree设置ref&#xff0c;通过监听roleName的变化过滤数据。 default-expand-all可以设置默认展开全部子节点。 check可以拿到当前节点的…