小和问题和逆序对问题

小和问题和逆序对问题

小和问题,

在一个数组中,每一个数左边的数中比当前数小的数累加起来,叫做这个数组的小和,求一个数组的小和
直接遍历:

int littleSum1(int* arr, int L, int R)
{int temp = 0;for (int i = L; i < R + 1; i++){for (int j = L; j < i; j++){if (arr[j] < arr[i]){temp = temp + arr[j];}}}return temp;
}

使用归并
求小和的问题可以等效为:
如求下面数组的小和

int arr[] = { 1,3,4,2,5 };

通常的思路:
1左边没有比1小的
3左边比3小的:1
4左边比4小的:1,3
2左边比2小的:1
5左边比5小的:1,3,4,2
加起来:1+1+3+1+1+3+4+2=16
等效为:
1右边有4个数比1大,则会小和中有4个1,41
3右边有2个数比3大,2
3
4右边有1个数比4大,14
2右边有1个数比2大,1
2
5右边没有数比5大,05
加起来4
1+23+14+12+05=16

在编写代码时与一般的归并有一点不一样,当左侧数组p1和右侧数组p2指向的数一样时先拷贝右侧的数,不然不知道有多少个数比左侧p1指向的数大,会有漏算的情况,其中process中 if (L >= R) return 0;//此处我认为是递归的中止条件,很多次忘记加这个条件导致无法出结果
务必别丢

int littleSum2(int* arr, int L, int R)
{if (L >= R) return 0;return process(arr, L, R);
}
int process(int* arr, int L, int R)
{if (L >= R) return 0;//此处我认为是递归的中止条件,很多次忘记加这个条件导致无法出结果int mid = L + ((R - L) >> 1);return process(arr, L, mid)+ process(arr, mid + 1, R)+merge_sum(arr, L, mid, R);}
int merge_sum(int* arr, int L, int mid, int R)
{int res = 0;int i = 0;int p1 = L;int p2 = mid + 1;int* temp = new int[R - L + 1];while (p1 <= mid && p2 <= R){if (arr[p1] < arr[p2]){res = res + (R - p2 + 1) * arr[p1];temp[i++] = arr[p1++];}else{temp[i++] = arr[p2++];}}while (p1 <= mid){temp[i++] = arr[p1++];}while (p2 <= R){temp[i++] = arr[p2++];}for (int j = 0; j < R-L + 1; j++){arr[L+j] = temp[j];}delete[] temp;return res;
}

逆序对问题

在一个数组中,左边的数如果比右边的数大,则两个数构成一个逆序对,请打印所有的逆序对

void Reverse_pair(int* arr, int L, int R)
{if (L >= R){cout << "无逆序对" << endl;return;}processReverse(arr, L, R);
}void processReverse(int* arr, int L, int R)
{if (L >= R)return;int mid = L + ((R - L) >> 1);processReverse(arr, L, mid);processReverse(arr, mid + 1, R);mergeReverse(arr, L, mid, R);
}
void mergeReverse(int* arr,  int L, int mid, int R)
{int i = 0;int* temp = new int[R - L + 1];int p1 = L;int p2 = mid + 1;while (p1 <= mid && p2 <= R){if (arr[p1] > arr[p2]){temp[i] = arr[p1];cout << "逆序对:" << arr[p1] << "   " << arr[p2] << endl;i = i + 1;p1 = p1 + 1;}else{temp[i++] = arr[p2++];}}while (p1 <= mid){temp[i++] = arr[p1++];}while (p2 <= R){temp[i++] = arr[p2++];}for (int j = 0; j < R - L + 1; j++){arr[L + j] = temp[j];}delete[] temp;
}

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

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

相关文章

Spring底层原理之bean的加载方式四 @import 注解

bean的加载方式四 import 第四种bean的导入方式 是import导入的方式 在配置类上面加上注解就行 package com.bigdata1421.config;import com.bigdata1421.bean.Dog; import org.springframework.context.annotation.Import;Import(Dog.class) public class SpringConfig4 {…

CesiumJS【Basic】- #041 绘制纹理线(Entity方式)- 需要自定义着色器

文章目录 绘制纹理线(Entity方式)- 需要自定义着色器1 目标2 代码2.1 main.ts3 资源文件绘制纹理线(Entity方式)- 需要自定义着色器 1 目标 使用Entity方式绘制纹理线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer

Java并发编程:最佳实践与性能优化

Java并发编程&#xff1a;最佳实践与性能优化 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 介绍并发编程 在当今软件开发中&#xff0c;多核处理器和分布式…

K8S学习教程(一):使用PetaExpress云服务器安装Minikube 集群题

什么是Minikube Minikube是一款工具&#xff0c;主要用于在本地运行 Kubernetes 集群。Kubernetes 开源的平台&#xff0c;用于自动化容器化应用的部署、扩展和管理&#xff0c;而Minikube 使得开发人员能够在本地机器上轻松创建一个单节点的 Kubernetes 集群&#xff0c;从而…

【高级篇】第6章 Elasticsearch 高级查询与搜索优化

在Elasticsearch的深入应用之旅中,掌握高级查询技巧与优化搜索性能是提升数据处理效率的关键。本章将带你深入探索Elasticsearch的高级查询特性,揭示搜索性能优化的奥秘,以及如何利用高亮与建议API增强用户体验。 6.1 复杂查询 6.1.1 Nested查询 Nested基本概念与用法: …

IT设备监控模板:支持多种监控工具和平台的集成和整合

IT设备监控模板管理在支持多种监控工具和平台方面发挥着关键作用&#xff0c;它通过提供统一的配置和管理界面&#xff0c;使运维人员能够灵活地适应和整合不同的监控工具和平台。以下是IT设备监控模板管理如何支持多种监控工具和平台的具体方式&#xff1a; 一、抽象化和标准…

如何使用AI学习一门编程语言?

无论你是软件开发新手还是拥有几十年的丰富经验&#xff0c;总是需要学习新知识。TIOBE Index追踪50种最受欢迎的编程语言&#xff0c;许多生态系统为职业发展和横向转型提供了机会。鉴于现有技术具有的广度&#xff0c;抽空学习一项新技能并有效运用技能可能困难重重。 最近我…

ARCGIS python 裁剪栅格函数 arcpy.management.Clip

ARCGIS python 裁剪栅格函数 arcpy.management.Clip 1 功能 裁剪掉栅格数据集、镶嵌数据集或图像服务图层的一部分。 2 使用情况 基于模板范围提取部分栅格数据集&#xff0c;输出与模板范围相交的所有像素使用以 x 和 y 坐标的最小值和最大值确定的包络矩形或使用输出范围文…

MATLAB-振动问题:单自由度阻尼振动系统受迫振动

一、基本理论 二、MATLAB实现 单自由度阻尼振动系统受迫振动&#xff0c;MATLAB代码如下&#xff1a; clear; clc; close allA 1; psi 0; F0 10; D 20; Rm 0.5; M 1; omega 2; delta Rm / (2*M); omega0 sqrt(D / M); Omega sqrt(omega0^2 - delta^2); Zm Rm i *…

多线程的三种创建方式

继承Thread类的方式进行实现 public class MyThread extends Thread{ Override public void run(){//多线程具体业务逻辑} }在main方法里面创建子类对象&#xff0c;开启线程 public static void main(String[] args) {MyThread t1 new MyThread(); MyThread t2 new MyThrea…

LLM大模型工程师面试经验宝典--基础版(2024.7月最新)

1.简单介绍一下大模型【LLMs】&#xff1f; 大模型&#xff1a;一般指1亿以上参数的模型&#xff0c;但是这个标准一直在升级&#xff0c;目前万亿参数以上的模型也有了。大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是针对语言的大模型。 2.目前主…

基于布雷格曼偏差校正技术的全变分一维时间序列信号降噪方法(MATLAB R2018A)

信号降噪是信号处理的重要步骤之一&#xff0c;目的是提高所获得信号数据的质量&#xff0c;以达到更高的定性和定量分析精度。信号降噪能提升信号处理其他环节的性能和人们对信息识别的准确率&#xff0c;给信号处理工作提供更可靠的保证。信号降噪的难点是降低噪声的同时也会…

69. x 的平方根(简单)

69. x 的平方根 1. 题目描述2.详细题解3.代码实现3.1 Python方法一&#xff1a;逐个遍历方法二&#xff1a;二分查找 3.2 Java 1. 题目描述 题目中转&#xff1a;69. x 的平方根 2.详细题解 不能使用系统内置的函数&#xff0c;寻找某个数&#xff08;假定为x&#xff09;的…

网络请求的高效处理:C++ libmicrohttpd库详解

一、libmicrohttpd简介 libmicrohttpd是一个小型的C语言库&#xff0c;用于创建HTTP服务器和客户端。它提供了HTTP 1.1协议的完整实现&#xff0c;包括持久连接、管道化请求、虚拟主机等特性。libmicrohttpd的特点是&#xff1a; 轻量级&#xff1a;易于集成到C或C项目中。跨…

微信好友不小心拉黑了?这样操作,友谊的小船不会翻

在数字化时代&#xff0c;微信已成为我们社交生活的核心&#xff0c;它不仅连接着亲朋好友&#xff0c;更承载着我们的情感与回忆。 然而&#xff0c;情绪波动时&#xff0c;我们可能会一时冲动&#xff0c;将某些好友误送入黑名单。但别担心&#xff0c;今天&#xff0c;就让…

IMU在手语识别中的应用

近期&#xff0c;一款由美国和中国科研团队联合研发的新型的穿戴设备——SignRing&#xff0c;以其独特的IMU&#xff08;惯性测量单元&#xff09;技术&#xff0c;为聋哑人士的手语识别带来了革命性的突破。SignRing不仅极大地扩展了手语识别的词汇量&#xff0c;更提高了识别…

二维数组-----螺旋性矩阵输出

题目有点难&#xff0c;ok其实是很难。。。 观察样例输出&#xff0c;不难发现&#xff0c;螺旋数组中元素的递增轨迹为&#xff1a;右右右、下下下、左左左、上上上 简明为&#xff1a;右、下、左、上。可以设开始递增的元素1的位置为&#xff08;x&#xff0c;y)&#xff0c…

由跨域引发一些思考

由跨域引发一些思考 前言什么是跨域&#xff1f;为什么会产生跨域&#xff1f;跨域场景示例&#xff1a;跨域常见的解决方法&#xff1a;JSONP&#xff08;JSON with Padding&#xff09;CORS&#xff08;Cross-Origin Resource Sharing&#xff09;document.domain iframeloc…

AutoHotKey自动热键(二)中文版帮助手册下载和自定义一般键盘快捷键

所有的操作其实在开发者手册中已经交待完了,所以我们要使用中文的手册来进行使用 autohotkey1.1.15中文手册下载 好了,为什么有了中文手册,这里还要进行一些具体的介绍呢,就是为了让大家少踩坑,能够快速形成生产力 这里先讲一下自定义快捷键WIN键和ALT键和CTRL键和SHIFT键的组…

智慧的网络爬虫之CSS概述

智慧的网络爬虫之CSS概述 ​ CSS 是“Cascading Style Sheet”的缩写&#xff0c;中文意思为“层叠样式表”&#xff0c;用于描述网页的表现形式。如网页元素的位置、大小、颜色等。css的主要作用是定义网页的样式。 CSS样式 1. 行内样式 行内样式&#xff1a;直接定义在 HT…