关于分治法左右区间单调遍历应该如何设计

阅读以下文章,首先至少要求通过一道分治法的题目或听过一道该类型的讲解。

对于分治的题目,想必你应该知道,通常我们是对于一个区间拆分两个部分,而最小子问题通常是只包含一个元素的区间数组。为了后续方便处理更大范围的区间,通常在处理该小区间后,我们会将其区间内元素排序,例如下面例子:

该例子是求:对于右区间的每个元素,求右侧大于左侧的元素个树,比如左数组为 2 3 右数组为:4 3,那么对于4来说2 3 两个都比4小,对于右侧的3来说只有2比他小,所以结果为3
在这里插入图片描述

很显然,我们可以使用两个指针,暴力遍历所有,直接求出答案,而该代码的时间复杂度为O( n 2 n^2 n2)

public static int GetKey(){int res=0;for(;left<mid=;left++){for(;right<=n;right++){   //n为区间最右端res+=num[right]>num[left]?1:0; //满足则加1,不满足则不加}}return res;
} 

在一次期末考试后,班主任决定颁发奖励,满足一定方式的学生都可以获得某个等级的奖励,对于分数高的同学既可以获取一等奖,也可以获取二,三等奖。聪明的班主任想到快速的方法分配奖励,他先将分数从低到高排序,他先从低级奖励分配,每次分配奖励,他先看看学生的分数,由于学生分数以排序,从左往右数,直到找到满足分数的学生,剔除前面的学生,毕竟连当前奖励分数都不满足,那么必定与后面的奖励无缘了,每分配下一等级的奖励,他都循环这一步骤。
这个故事是有一定的开导性的。
自然可以想到一种更好的方法了(对于有单调性的题目一般都可以,所谓单调性是:如果a>b,b>c,一定有a>c)
那就是左右两侧都先排序,利用有序性,则可以减少大部分的计算,例如下图

1.右指针指向的元素是大于左指针指向的元素,由于排序后,右指针后面的其实都大于左指针指向的元素,所以大于23的右侧元素个数为区间右端减去右指针再加1。
2.然而聪明的你意思到,这并不对,因为你怎么确定右指针的左侧不会有比23大的树呢,其实对于左右指针的控制确保了右指针的前面不会存在比左指针大的情况的。在这里插入图片描述

public static int GetKey(){for(;left<=mid;left++){          //遍历每一个需要满足的条件while(right<n&&num[right]<=num[left]){      //向右寻找满足条件的元素right++;           }if(right<n){       //如果有满足元素的话res+=n-1-right+1;     //n-1代表区间最右下标}else{break;  //当前过滤的没有满足的元素了,那么后面更不可能了}}	return res;
}

仔细观察该代码,是不是发现右指针前面的元素一定不会大于左指针的呢!

刚学完,来试试可不可以立即想到一种解决方案,毕竟不是所有题的单调性都是这么直观的。
数组还是上面的图片,但是条件换为num[left]>num[right]*2。

这与上面的题目类似,只不过是左右大小条件换了,变成左侧大于右侧,那么你可以把条件当作右侧,分数当作左侧(引用上面的故事)。

以下是答案

public static int GetKey(){for(;right<n;right++){int res=0;while(left<=mid&&num[left]<=num[right]){left++;}if(left<=mid){res+=mid-left+1;}}return res;
}

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

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

相关文章

【软件测试】敏捷模型(Scrum模型)和V模型、W模型

敏捷模型 前面的那些模型以前非常流行&#xff0c;但现在开发人员在使用的时候会遇到各种问题。主要困难包括在项目开发期间处理来自客户的变更请求&#xff0c;以及合并这些变更所需要的高成本和时间。 在实际工作中&#xff0c;一款产品的功能是不断在变化的 所以为了克服这…

大数据新视界 -- 大数据大厂之 Impala 性能优化:数据加载策略如何决定分析速度(上)(15/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

掌握核密度图:精准描绘不同年龄段的血糖分布

在医学研究中&#xff0c;数据的可视化是理解复杂信息和做出科学决策的关键。今天&#xff0c;我们将深入探讨一种强大的数据可视化工具——核密度图&#xff08;Kernel Density Plot&#xff0c;简称KDE&#xff09;&#xff0c;并通过Python代码实例&#xff0c;展示如何基于…

实验室信息管理系统源码,医院LIS系统源码,C/S结构,C#语言开发,适合上项目。

实验室信息管理系统源码&#xff0c;医院LIS系统源码&#xff0c;三甲以下医院需求都能满足。 LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化&#xff0c;检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后&#xff0c;自动生成打…

计算机在启动一直到系统加载完成期间进行了哪些操作

零 扇区和分区的概念与联系 概念 扇区&#xff08;Sector&#xff09;&#xff1a; 扇区是硬盘中最小的物理存储单位&#xff0c;每个扇区通常为512字节&#xff08;一些新硬盘为4KB&#xff09;。硬盘在制造时会被划分成许多扇区&#xff0c;这些扇区在硬盘中依次排列。数据被…

Meta AI 新技术,赋予机器人 “触觉” 的革命

Meta AI 新技术&#xff0c;赋予机器人 “触觉” 的革命 简介 传统机器人的局限 Meta AI 的新技术突破 技术应用前景 未来展望 简介 在科技飞速发展的今天&#xff0c;人工智能领域不断取得令人惊叹的突破。11月4日&#xff0c;Meta公司宣布其基础人工智能研究团队(FAIR)在…

IPguard与Ping32加密软件对比评测,哪款更适合企业数据保护?

在信息化时代&#xff0c;企业的数据安全至关重要&#xff0c;特别是在文件管理和源代码加密方面&#xff0c;更需要强有力的防护工具。目前&#xff0c;IPguard与Ping32是市场上两款常用的企业数据加密软件。今天&#xff0c;我们从多方面进行对比&#xff0c;为大家解析哪款软…

【linux】CentOS 的软件源(Repository)学习

CentOS 7 的软件源&#xff08;Repository&#xff09;是用于分发和管理软件包的集中存储库。这些源包含了操作系统所需的各种软件包&#xff0c;包括系统工具、库、应用程序等。通过配置不同的软件源&#xff0c;用户可以选择从不同的服务器下载软件包&#xff0c;以提高下载速…

PyQt5超详细教程终篇

PyQt5超详细教程 前言 接&#xff1a; [【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;](【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;-CSDN博客) 建议把代码复制到pycahrm等IDE上面看实际效果&#xff0c;方便理…

JSX 语法与基础组件使用

在 React Native 中&#xff0c;JSX 是一种 JavaScript 的语法扩展&#xff0c;用于描述 UI 界面。JSX 语法类似于 HTML&#xff0c;但它是 JavaScript 的语法糖&#xff0c;可以直接在 JavaScript 代码中编写 UI 组件。本章节将介绍 JSX 语法的基础知识&#xff0c;以及 React…

会议直击|美格智能受邀出席第三届无锡智能网联汽车生态大会,共筑汽车产业新质生产力

11月10日&#xff0c;2024世界物联网博览会分论坛——第三届无锡智能网联汽车生态大会在无锡举行&#xff0c;美格智能CEO杜国彬受邀出席&#xff0c;并参与“中央域控&#xff1a;重塑汽车智能架构的未来”主题圆桌论坛讨论&#xff0c;与行业伙伴共同探讨智能网联汽车产业领域…

昇思大模型平台打卡体验活动:项目1基于MindSpore实现BERT对话情绪识别

基于MindSpore实现BERT对话情绪识别 1. 模型简介 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由Google于2018年末开发并发布的一种新型语言模型&#xff0c;基于Transformer架构中的Encoder&#xff0c;并且具有双向编码的特性。…

vue+Springboot实现简单文件上传到本地

实现效果 点击上传文件按钮后&#xff0c;选择需要上传的文件&#xff0c;如果是图片的话&#xff0c;上传成功后可以直接在下面预览。 前端页面 <template><div class"file-upload"><el-upload:headers"getUploadConfig(token).headers"…

解决 Vue3、Vite 和 TypeScript 开发环境下跨域的问题,实现前后端数据传递

引言 本文介绍如何在开发环境下解决 Vite 前端&#xff08;端口 3000&#xff09;和后端&#xff08;端口 80&#xff09;之间的跨域问题&#xff1a; 在开发环境中&#xff0c;前端使用的 Vite 端口与后端端口不一致&#xff0c;会产生跨域错误提示&#xff1a; Access to X…

Java项目实战II基于微信小程序的订餐系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导 一、前言 随着移动互联网技术的飞速发展&#xff0…

闯关leetcode——202. Happy Number

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/happy-number/description/ 内容 Write an algorithm to determine if a number n is happy. A happy number is a number defined by the following process: Starting with any positive inte…

昇思大模型平台打卡体验活动:项目4基于MindSpore实现Roberta模型Prompt Tuning

基于MindNLP的Roberta模型Prompt Tuning 本文档介绍了如何基于MindNLP进行Roberta模型的Prompt Tuning&#xff0c;主要用于GLUE基准数据集的微调。本文提供了完整的代码示例以及详细的步骤说明&#xff0c;便于理解和复现实验。 环境配置 在运行此代码前&#xff0c;请确保…

中国药品注册审批数据库- 药品注册信息查询与审评进度查询方法

药品的注册、审评审批进度信息是医药研发相关人员每天都会关注的信息&#xff0c;为了保证药品注册申请受理及审评审批进度信息的公开透明&#xff0c;CDE药审中心提供药品不同注册分类序列及药品注册申请受理的审评审批进度信息查询服务。但因CDE官网的改版导致很大一部分人不…

FMC 扩展子卡6 路 422,8 组 LVDS,8 路 GPIO

FMC 扩展子卡6 路 422,8 组 LVDS,8 路 GPIO 卡是一款支持多路 LVCMOS 和 LVDS 信号互转的 FMC 扩展子板。它能支持 6 路 422 信号的输入 / 输出 ,8 组 LVDS 信号的输入 / 输出和 8 路 GPIO 信号的输入 / 输出。本产品基于一些逻辑转换芯片而设计&#xff0c;能实现差分信号转单…

C++builder中的人工智能(21):Barabási–Albert model(BA)模型

在此之前&#xff0c;大多数网络被想当然的认为是随机的&#xff0c;因此连接度分布可以近似用泊松分布来表示&#xff0c;而巴拉巴西与其学生阿尔伯特、郑浩雄通过对万维网度分布测量的结果却显示万维网度分布服从幂律分布&#xff0c;存在枢纽节点&#xff08;拥有大量链接的…