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

news/2024/7/8 2:29:43 标签: leetcode, java, 算法

文章目录

1、分治法

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

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

leetcode169_19">2、leetcode169:多数元素

在这里插入图片描述

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

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

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

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

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

代码实现:

java">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;

    }
}

leetcode53_78">3、leetcode53:最大子序和

在这里插入图片描述

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

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

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

java">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.niftyadmin.cn/n/5536114.html

相关文章

LLama-Factory大模型训练框架,基于自己数据集微调qwen7B模型实战

一&#xff0c;项目简介 LLama-Factory&#xff0c;大模型训练框架&#xff0c;支持多种模型&#xff0c;多种训练方式&#xff0c; 项目github地址&#xff1a;link 项目特色 多种模型&#xff1a;LLaMA、LLaVA、Mistral、Mixtral-MoE、Qwen、Yi、Gemma、Baichuan、ChatGL…

《自动驾驶中的SLAM技术》第2章: 基础数学知识回顾 习题

自动驾驶中的SLAM技术 第2章: 基础数学知识回顾 习题 1 分别使用左右扰动模型&#xff0c;计算 ∂ R − 1 p ∂ R \frac{\partial \mathbf{R}^{-1}\mathbf{p}}{\partial \mathbf{R}} ∂R∂R−1p​。 左扰动模型 ∂ R − 1 p ∂ R lim ⁡ δ ϕ → 0 ( E x p ( δ ϕ ) R…

数据结构(3.8)——栈的应用

栈在括号匹配中的应用 流程图 代码 #include <stdio.h> #include <stdlib.h> #define MaxSize 10typedef struct {char data[MaxSize];int top; } SqStack;// 初始化栈 void InitStack(SqStack* S) {S->top -1; // 初始化栈顶指针 }// 判空 bool StackEmpty(…

JavaScript 原型链那些事

在讲原型之前我们先来了解一下函数。 在JS中&#xff0c;函数的本质就是对象&#xff0c;它与其他对象不同的是&#xff0c;创建它的构造函数与创建其他对象的构造函数不一样。那产生函数对象的构造函数是什么呢&#xff1f;是一个叫做Function的特殊函数&#xff0c;通过newFu…

nginx部署多个项目;vue打包项目部署设置子路径访问;一个根域名(端口)配置多个子项目

本文解决&#xff1a; vue打包项目部署设置子路径访问&#xff1b;nginx部署多个子项目&#xff1b;一个ip/域名 端口 配置多个子项目&#xff1b;配置后&#xff0c;项目能访问&#xff0c;但是刷新页面就丢失的问题 注&#xff1a;本文需要nginx配置基础。基础不牢的可见文…

代码随想录leetcode200题之额外题目

目录 1 介绍2 训练3 参考 1 介绍 本博客用来记录代码随想录leetcode200题之额外题目相关题目。 2 训练 题目1&#xff1a;1365. 有多少小于当前数字的数字 解题思路&#xff1a;二分查找。 C代码如下&#xff0c; class Solution { public:vector<int> smallerNumb…

SpringBoot应用配置桥接Prometheus入门

SpringBoot应用配置Prometheus步骤 SpringBoot应用依赖要求PrometheusGrafanaGrafana监控界面模板 SpringBoot应用依赖要求 <!-- 监控系统健康情况的工具 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…