LeetCode分类习题-分治-程序员宅基地

技术标签: Java  算法  分治算法  leetcode  

分治算法

1.多数元素

此题思路非常多,主要介绍分治思想的应用和常见其他解法。

1.1 分治法

求原数组的众数可以转化成求各子数组的众数,最后将子数组的结果合并为原数组结果。这就涉及两个问题:

a)递归头。当子数组只有一个元素时,众数即为该元素。

b)合并规则。

class Solution {
    
    public int majorityElement(int[] nums) {
    
        return getMajority(nums, 0, nums.length - 1);

    }

    // 计算左(或右)区间的众数各自在整个数组中出现了多少次
    private int countInRange(int[] arr, int target, int L, int R){
    
        int count = 0;
        for (int i = L;i <= R;i++){
    
            if (arr[i] == target) count++;
        }
        return count;
    }
    private int getMajority(int[] nums, int L, int R){
    
        // 递归头
        if (L == R) return nums[L];

        // 分治核心算法
        int mid = L + (R - L) / 2;
        int left = getMajority(nums, L, mid);
        int right = getMajority(nums, mid + 1, R);

        // 递归结果判定,左边的结果在整个数组中出现次数多就返回left,否则返回right
        if (left == right) return left;
        if (countInRange(nums, left, L, R) >= countInRange(nums, right, L, R)){
    
            return left;
        }else{
    
            return right;
        }
    }
}

1.2 哈希表

第一步先将数组中所有元素写到哈希表中,以元素为key,出现次数为value。第二步类似冒泡排序第一步,“打擂”的方式找出值最大的entry。返回其键即可。

class Solution {
    
    public int majorityElement(int[] nums) {
    
        Map<Integer, Integer> counts = new HashMap<>();
        for (int num: nums){
    
            if (counts.containsKey(num)){
    
                counts.put(num, counts.get(num) + 1);
            }else{
    
                counts.put(num, 1);
            }
        }

        Map.Entry<Integer, Integer> modeEntry = null;
        for (Map.Entry<Integer, Integer> entry: counts.entrySet()){
    
            if (modeEntry == null || modeEntry.getValue() < entry.getValue()){
    
                modeEntry = entry;
            }
        }
        return modeEntry.getKey();
    }
}

1.3 排序

将原数组排序后,处于n/2位置的元素必然是“众数”。

class Solution {
    
    public int majorityElement(int[] nums) {
    
        Arrays.sort(nums);
        return nums[nums.length / 2];
    }
}

2.最大子序和

2.1 分治法

a)递归头:只有一个元素的子数组的最大子序和就是该元素。

b)合并准则:总的最大子序和必然是是由各子问题(只有一个元素)的最大子序和相加而成。

class Solution {
    
    public int maxSubArray(int[] nums) {
    
        if (nums.length == 1) return nums[0];

        int left = maxSubArray(Arrays.copyOfRange(nums, 0, nums.length / 2));
        int right = maxSubArray(Arrays.copyOfRange(nums, nums.length / 2, nums.length));

        // max_L和max_R的设计是为检验左数组的最大子序和和右数组的最大子序和能否连在一起,不能的话就取左、右较大的那个。
        int max_L = nums[nums.length / 2 - 1];
        int tmp = 0;
        for (int i = nums.length / 2 - 1;i >= 0;i--){
    
            tmp += nums[i];
            max_L = Math.max(tmp, max_L);
        }

        int max_R = nums[nums.length / 2];
        int temp = 0;
        for (int j = nums.length / 2;j < nums.length;j++){
    
            temp += nums[j];
            max_R = Math.max(temp, max_R);
        }
        
        int max_LR = Math.max(left, right);
        return max_LR > (max_L + max_R)? max_LR: (max_L + max_R);
    }
}

2.2 动态规划

本质和分治类似,每一步的状态取决于前一步的状态(截止当前元素时的最大子序和),那任务也是找到:

a)递归头:即dp中的边界条件,dp[0] = nums[0]

b)合并规则:如果当前元素大于0,dp[i] = dp[i-1] + nums[i];否则dp[i-1]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/drunkwhisky/article/details/108111039

智能推荐

机器学习-Anomaly Detection_根据f1值或者查准率与查全率的比例来选择ε-程序员宅基地

文章浏览阅读347次。Problem Motivation异常检测(Anomaly detection)是机器学习算法的一个常见应用。这种算法的一个有趣之处在于:它虽然主要用于非监督学习问题,但从某些角度看,它又类似于一些监督学习问题。假想你是一个飞机引擎制造商,当你生产的飞机引擎从生产线上流出时,你需要进行 QA(质量控制测试),而作为这个测试的一部分,你测量了飞机引擎的一些特征变量,比如引擎运转时产生的热量,..._根据f1值或者查准率与查全率的比例来选择ε

【蓝桥杯2024真题】好数

【评测用例规模与约定】 对于10%的评测用例,1≤N≤100。对于100% 的评测用例,【样例说明】 对于第一个样例,24以内的好数有1、3、5、7、9、21、23,一共7个。时间限制: 1.0s 内存限制: 256.0MB 本题总分:10分。【输出格式】 一个整数代表答案。【输入格式】 一个整数N。【样例输入2】 2024。【样例输出2】 150。【样例输入1】 24。

Java毕业设计 基于SpringBoot vue城镇保障性住房管理系统

首页 图片轮播 房源信息 房源详情 申请房源 公示信息 公示详情 登录注册 个人中心 留言反馈后台管理 登录 个人中心 修改密码 个人信息 用户管理 房屋类型 房源信息管理 房源申请管理 住房分配管理 留言板管理 轮播图管理 公示信息管理角色:用户 管理员大家可。

xhadmin多应用SaaS框架之智慧驾校H5+小程序v1.1.5正式发布!

xhadmin 是一套基于最新技术的研发的多应用 Saas 框架,支持在线升级和安装模块及模板,拥有良好的开发框架、成熟稳定的技术解决方案、提供丰富的扩展功能。为开发者赋能,助力企业发展、国家富强,致力于打造最受欢迎的多应用 Saas 系统。

【Vue3源码学习】— CH3.4 baseCreateRenderer 详解

在 baseCreateRenderer 中,定义了多种方法,例如 patch、mountComponent、updateComponent 等,这些方法各自承担不同的渲染任务。这些定义不直接执行任何操作,而是为后续的渲染流程提供必要的工具和函数。baseCreateRenderer 更像是一个配置和定义渲染器行为的场所,而具体的渲染逻辑则是在实际调用 render 方法时,按需执行这些预定义的方法。这样的设计不仅清晰地分离了配置与执行,也使得 Vue 渲染器可以灵活地适应不同的渲染需求和环境。

ROS1快速入门学习笔记 - 10服务数据的定义和使用

三个横线作为一个区分,上面是request,下面是response;创建完之后如下所示。

随便推点

空调采集网关让空调更智能,让节能更简单!_空调外接网关进行数据采集的方案-程序员宅基地

文章浏览阅读304次。钡铼技术作为全球行业领先技术水平的工业物联网硬件研发企业,拥有资深的工控物联网产品的研发能力以及专业的工业物联网技术研发团队,为大型园区、楼宇、医院、学校、工厂机房等多种场景提供中央空调集成通信解决方案,根据各大空调制造商运用的不同协议,钡铼技术研发的空调采集网关目前支持大金、日立、东芝、三菱电机、海信、海尔、松下、约克、三菱重工、美的、奥克斯、博世、LG、格力等多个领先空调品牌。空调控制系统由云服务器、空调采集网关、空调设备组成。2、据测算,在正确使用空调的前提下,制冷空调温度每提高1℃,可节电8%;_空调外接网关进行数据采集的方案

经典收藏 50个jQuery Mobile开发技巧集萃-程序员宅基地

文章浏览阅读460次。1、Backbone移动实例这是在Safari中运行的一款Backbone移动应用程序。想开始体验移动开发,一个好的出发点就是关注这个应用程序的构建方式。先不妨在你的浏览器中查看该应用程序。相关链接:http://bennolan.com/2010/11/24/backbone-jquery-demo.html2、使用媒体查询来锁定设备你可能会问如何使用CSS来锁定设备(根...

C++GDI做进度条-程序员宅基地

文章浏览阅读264次。直接上代码:#include <windows.h> /* This is where all the input to the window goes to */LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { /* Upon destruction, tell the main thread to stop */ ..

7-34 通讯录的录入与显示 -----python_7-34 通讯录的录入与显示python-程序员宅基地

文章浏览阅读1.4k次。通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。 本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。输入格式:输入在第一行给出正整数N(≤10);随后N行,每行按照格式姓名 生日 性别 固话 手机给出一条记录。其中姓名是不超过10个字符、不包含空格的非空字符串;生日按yyyy/mm/dd的格式给出年月日;性别用M表示“男”、F表示“女..._7-34 通讯录的录入与显示python

K210与STM32之间的通信_k210与stm32通信-程序员宅基地

文章浏览阅读5.1k次,点赞2次,收藏70次。K210与STM32之间使用串口进行通信_k210与stm32通信

OpenHarmony语言基础类库【@ohos.util.List (线性容器List)】

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点。

推荐文章

热门文章

相关标签