【LeetCode】十三、分治法:多数元素 + 最大子序列和

文章目录

  • 1、分治法
  • 2、leetcode169:多数元素
  • 3、leetcode53:最大子序和

1、分治法

分治一般都搭配递归使用:

在这里插入图片描述

在这里插入图片描述

用分治法的一个应用——归并排序:将一组数不停的一分为二,直到分到每组只有一个数的时候

在这里插入图片描述

分到每组只有一个数的时候,到达递归终止的条件(把一个排序的大问题,分成了少量元素排序的小问题),开始倒着往回退,每层分别排序各自组里的数据,即小问题的解

在这里插入图片描述

组合小问题的解,就是最终的排序结果。比较左右两个小问题的解(有序数列)的首元素,每次比较拿出小的那个首元素放入最终的结果。 因此说:左右两边分别是有序的,那把它两合并成一个新的有序的结果是更容易的。

2、leetcode169:多数元素

在这里插入图片描述

这题本质还是要用到元素出现的次数,也就是要统计次数,首先用HashMap的数据结构,就可以解决

这里用分治法解决一下:把一组数分成一个个不可再分的元素(分治法里所说的小问题),再分别求众数,往上开始一层回退递归,如果左边有一半以上的数是n,右边也有一半以上的数是n,那左右两边合并后,多数元素就也是n。

为什么可以用分治,因为,如果a是数组num的众数,那么将num一分为二后,至少有一边的众数也是a,因此分治得到的最终的结果是正确的。

其次,每次左右两边的众数如果相等,则这一个区间的众数就是该值,反之,左右两边的众数值不一样,那就要比较这两个众数在区间里出现的次数,来决定选谁,如果连出现的次数也一样,那就随机取一个。

举例:
在这里插入图片描述

代码实现:

public class P169 {public static int majorityElement(int[] nums) {return getMajority(nums, 0, nums.length - 1);}public static int getMajority(int[] nums, int left, int right) {// 数组只有一个元素了,不可再分,到达递归的终止条件if (left == right) {return nums[left];}// 一分为二,获取左右两边的多数元素int mid = left + (right - left) / 2;int leftMajority = getMajority(nums, left, mid);int rightMajority = getMajority(nums, mid + 1, right);if (leftMajority == rightMajority) {return leftMajority;}// 左右两边的多数元素结果不相等,统计次数int leftCount = 0;int rightCount = 0;for (int i = left; i <= right; i++) {if (nums[i] == leftMajority) {leftCount++;}if (nums[i] == rightMajority) {rightCount++;}}return leftCount >= rightCount ? leftMajority : rightMajority;}
}

3、leetcode53:最大子序和

在这里插入图片描述

这题,是定长的子数组的话,那就是一个滑动窗口。现在不定长,可以这样想:如果前面一串的和小于0,那我再要他们和我加一起的话,只会让我越来越小,形象的说,过去那一串整体就是累赘,应该从我这儿重新开始累加。

反之,前面那一串的和大于0,那说明祖上有家产,不论多少,继承过来继续累加。前面那一串的和大于0,说明不管那一串有几个正数几个负数(几个挣钱的、几个败家的),传到我这儿总是有剩余钱的,没有负债,那就继承。

这题,不是区分哪一个元素是正数或负数,就来决定是丢是留,而是从一段上来看,是正的还是负的,比如:11,-10,999,不能一见到-10就把11也扔了,整体 > 0就可以累加

public class P53 {public static int maxSubArray(int[] nums) {if (null == nums || nums.length == 0) {return 0;}// 不能赋值0,否则,nums = {-1}时,有bug:和为-1,输出0int result = nums[0];int pre = 0;for (int num : nums) {// 如果过去前面那一串的和小于0,是累赘,那我就从自己这儿重新开始if (pre < 0) {pre = num;} else {// 如果过去前面那一串的和大于0,说明家里祖上有点家产,那就继承pre = pre + num;}// 每处理一个元素,覆盖下最值result = Math.max(result, pre);}return result;}
}

再用分治法解决一次。可以看到,一组数一分为二,其序列和的最大值可能出现在三个地方:左侧、中间(横跨左右)、右侧。

图解下,左右两边的最大序列和与最终的结果对比如下:发现最终的结果可能是左侧最大值、右侧最大值、左侧+右侧

在这里插入图片描述

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

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

相关文章

Python28-7.5 降维算法之t-分布邻域嵌入t-SNE

t-分布邻域嵌入&#xff08;t-distributed Stochastic Neighbor Embedding&#xff0c;t-SNE&#xff09;是一种用于数据降维和可视化的机器学习算法&#xff0c;尤其适用于高维数据的降维。t-SNE通过将高维数据嵌入到低维空间&#xff08;通常是二维或三维&#xff09;中&…

Edge浏览器油猴插件的安装与使用

油猴 (又称篡改猴或Tampermonkey) 是最流行的浏览器扩展之一。它允许用户自定义并增强网页的功能。用户脚本是小型 JavaScript 程序&#xff0c;可用于向网页添加新功能或修改现有功能。使用油猴&#xff0c;您可以轻松在任何网站上创建、管理和运行这些用户脚本。 1.插件的安…

【数据结构与算法】希尔排序

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​

关于新装Centos7无法使用yum下载的解决办法

起因 之前也写了一篇类似的文章&#xff0c;但感觉有漏洞&#xff0c;这次想直接把漏洞补齐。 问题描述 在我们新装的Centos7中&#xff0c;如果想要用C编程&#xff0c;那就必须要用到yum下载&#xff0c;但是&#xff0c;很多新手&#xff0c;包括我使用yum下载就会遇到一…

mupdf加载PDF显示中文乱码

现象 加载PDF显示乱码,提示非嵌入字体 non-embedded font using identity encoding调式 在pdf-font.c中加载字体 调试源码发现pdf文档的字体名字居然是GBK&#xff0c;估计又是哪个windows下写的pdf生成工具生成pdf 字体方法&#xff1a; static pdf_font_desc * load_cid…

用QFramework重构飞机大战(Siki Andy的)(下01)(06-0? 游戏界面及之后的所有面板)

GitHub // 官网的 全民飞机大战&#xff08;第一季&#xff09;-----框架设计篇&#xff08;Unity 2017.3&#xff09; 全民飞机大战&#xff08;第二季&#xff09;-----游戏逻辑篇&#xff08;Unity 2017.3&#xff09; 全民飞机大战&#xff08;第三季&#xff09;-----完善…

Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇

Nginx七层&#xff08;应用层&#xff09;反向代理 HTTP反向代理proxy_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of thi…

Python3极简教程(一小时学完)中

异常 在这个实验我们学习 Python 的异常以及如何在你的代码中处理它们。 知识点 NameErrorTypeError异常处理&#xff08;try..except&#xff09;异常抛出&#xff08;raise&#xff09;finally 子句 异常 在程序执行过程中发生的任何错误都是异常。每个异常显示一些相关…

fasttext工具介绍

fastText是由Facebook Research团队于2016年开源的一个词向量计算和文本分类工具。尽管在学术上并未带来巨大创新&#xff0c;但其在实际应用中的表现却非常出色&#xff0c;特别是在文本分类任务中&#xff0c;fastText往往能以浅层网络结构取得与深度网络相媲美的精度&#x…

Maven一键配置阿里云远程仓库,让你的项目依赖飞起来!

文章目录 引言一、为什么选择阿里云Maven仓库&#xff1f;二、如何设置Maven阿里云远程仓库&#xff1f;三、使用阿里云Maven仓库的注意事项总结 引言 在软件开发的世界里&#xff0c;Maven无疑是一个强大的项目管理工具&#xff0c;它能够帮助我们自动化构建、依赖管理和项目…

QT5.14.2与Mysql8.0.16配置笔记

1、前言 我的QT版本为 qt-opensource-windows-x86-5.14.2。这是QT官方能提供的自带安装包的最近版本&#xff0c;更新的版本需要自己编译源代码&#xff0c;可点击此链接进行下载&#xff1a;Index of /archive/qt/5.14/5.14.2&#xff0c;选择下载 qt-opensource-windows-x86…

为什么固定尺寸 AdSense 广告依旧会出现并非指定的尺寸广告?

经常在网站上投放谷歌 AdSense广告的站长应该都碰到过&#xff0c;明明投放的是固定尺寸的广告位里旧会出现并非指定尺寸的AdSense 广告&#xff0c;很诡异的感觉。其实这都是因为你的 AdSense 账号广告优化造成的&#xff0c;其中里面就包含了广告尺寸优化&#xff0c;只需要在…

Spring源码十七:Bean实例化入口探索

上一篇Spring源码十六&#xff1a;Bean名称转化我们讨论doGetBean的第一个方法transformedBeanName方法&#xff0c;了解Spring是如何处理特殊的beanName&#xff08;带&符号前缀&#xff09;与Spring的别名机制。今天我们继续往方法下面看&#xff1a; doGetBean 这个方法…

Vue笔记11-Composition API的优势

Options API存在的问题 使用传统Options API中&#xff0c;新增或者修改一个需求&#xff0c;就需要分别在data&#xff0c;methods&#xff0c;computed里修改&#xff0c;而这些选项分布在代码的各个地方&#xff0c;中间还穿插着其他Optional API&#xff0c;如果代码量上来…

JAVA之(方法的重载与重写、this关键字、super关键字)

方法的重载与重写 一、方法的重载与重写1、回顾方法的定义2、重载的概念3、重写 二、this关键字1、何为this方法2、使用方法&#xff08;1&#xff09;在构造方法中指构造器所创建的新对象&#xff08;2&#xff09; 方法中指调用该方法的对象&#xff08;3&#xff09; 在类本…

centos7.9 rpm包安装mysql8.2.0数据库、root设置客户端登录、配置并发、表名大小写敏感、启动重启指令等记录

centos安装mysql8数据库,下载的是rpm-bundle.tar包,这样可以在内网环境离线安装,工作中医院的服务器很多也是内网的,所以这里记录下rpm-bundle.tar包安装的步骤。 lscpu 查看处理器是x86还是arm 下载对应的版本 bundle tar包 ((mysql-8.2.0-1.el7.x86_64.rpm-bundle.tar))…

2023年了,还在手动px转rem吗?

px-to-rem 使用amfe-flexible和postcss-pxtorem在webpack中配置px转rem npm i amfe-flexible -Snpm i postcss-pxtorem -D在main.js中 import flexible from amfe-flexible Vue.use(flexible);index.html中 <meta name"viewport" content"widthdevice-w…

Web3D引擎,three.js堪称扛把子,Babylon.js差点意思。

涉及到Web3D开发&#xff0c;Three.js和Babylon.js是两个备受推崇的引擎。它们都是基于WebGL的开源3D引擎&#xff0c;用于创建交互式的3D图形应用程序&#xff0c;但要细论起来&#xff0c;three.js普及度远超Babylon .js. 一、二者的介绍 Three.js&#xff1a; Three.js 是一…

Socket编程用到的函数TCP UDP实例

最基本的 Socket 模型 参考这次答应我&#xff0c;一举拿下 I/O 多路复用&#xff01; (qq.com) Socket编程详解-CSDN博客 Socket是一种通信机制&#xff0c;通过它可以在不同主机之间进行数据交换。在Socket编程中&#xff0c;有两种常见的通信模式&#xff1a;客户端-服务…

PIP换源的全面指南

##概述 在Python的世界里&#xff0c;pip是不可或缺的包管理工具&#xff0c;它帮助开发者安装和管理Python软件包。然而&#xff0c;由于网络条件或服务器位置等因素&#xff0c;直接使用默认的pip源有时会遇到下载速度慢或者连接不稳定的问题。这时&#xff0c;更换pip源到一…