首页 > 其他分享 >分治法学习笔记

分治法学习笔记

时间:2023-02-03 22:58:18浏览次数:42  
标签:元素 nums int 分治 笔记 学习 数组 left

分治法学习笔记

目录

1,什么是分治法

字面意思,就是将一个大问题分解为若干个小问题求解,然后再用小问题的解组成大问题的解。

2,什么时候使用分治法

当一个问题明显可以分为问题相同,但是规模更小的子问题,并且子问题容易求解的时候,考虑分治法。

3,分治法的解题步骤

分治法有比较通用的套路:

  1. 求解边界条件,即最小规模的子问题直接算出
  2. 将大问题分解为小问题,通常用都是一分为二,然后调用自己求解小问题
  3. 将小问题的解组合得出大问题的解

4,分治法与动态规划的异同

相同点:都是将大问题分解为更小规模的子问题求解

不同点:

  • 分治法的子问题通常不具有重叠的子结构,而且分治法通常使用递归算法
  • 动态规划的子问题具有重叠的子结构,且动态规划通常使用数组存储子问题的答案,并且使用迭代算法

5,例题

来实践一下:

例题:

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例一:
输入:nums = [3,2,3]
输出:3

解题思路:

1,大小为n的数组求多数元素不好求,但是大小为1的数组的多数元素好求。
2,因此,我们使用分治法,将大小为n的数组分解为两个大小为n/2的数组,求出两个数组的多数元素,然后合并。
3,当两个数组的多数元素相等时,总的多数元素即为该元素;
	当两个数组的多数元素不相等时,遍历这两个数组,分别求出两个候选多数元素的数量,谁的数量多即为总的多数元素。

代码:

class Solution {
    public int majorityElement(int[] nums) {
        int len = nums.length;
        return fun(nums, 0, len-1);
    }
    public int fun(int[] nums, int left, int right){
        if (left == right)
            return nums[left];
        int mid = (left+right)/2, v1=fun(nums,left,mid), v2=fun(nums,mid+1,right);
        if (v1 == v2)
            return v1;
        return merge(nums,v1, v2, left, right);
    }
    public int merge(int[] nums, int v1, int v2, int left, int right){
        int count1=0, count2=0;
        for(int i = left; i <= right; i++){
            if (nums[i] == v1)
                count1++;
            if (nums[i] == v2)
                count2++;
        }
        return count1 >= count2 ? v1 : v2;
    }
}

标签:元素,nums,int,分治,笔记,学习,数组,left
From: https://www.cnblogs.com/wyh-s/p/17090639.html

相关文章

  • 2022React学习笔记,欢迎批评和指正。
    前言:这是一篇自学笔记,帮助自己的React学习,此学习笔记中只记录教程中对我来说比较又触动的点。观看的视频教程链接如下:001_尚硅谷react教程_react简介_哔哩哔哩_bilibili......
  • 递归-分治
    递归递归,将问题分解为重叠的子问题,f(n)=f(n-1)+xxx,满足这样的状态转移方程,说明原问题是不是依赖递归子问题,即f(n)依赖f(n-1)确定递归出口递归返回时还原现场78.子......
  • Node.js学习第四天-cnblog
    Node.js学习第四天1.基本使用安装[email protected]创建最基本的web服务器constexpress=require('express')constapp=express()app.listen(80,()=>{......
  • 贪心算法学习笔记
    贪心算法学习笔记目录贪心算法学习笔记1,什么是贪心算法2,什么时候使用贪心算法3,贪心算法的解题步骤1,什么是贪心算法贪心算法就是以每次都选局部最优,以期望得出全局最优的......
  • 算法学习笔记(12): 线性基
    线性基熟练掌握异或运算是食用本文的大前提,请读者留意是什么?是一种利用线性代数的知识,用于解决异或问题的一种手段(不能算作数据结构吧这)本文并不会涉及到线性代数。......
  • 【笔记】阅读姜启源《数学模型》(烂尾版)
    1.三个引例(1)椅子怎么放平(2)安全渡河(多步决策)(3)药物中毒(线性微分方程) 2.初等模型(1)光盘的数据容量(螺旋线)(2)双层玻璃窗(热传导)(3)划艇比赛的成绩与桨手数量的关系(4)实物交......
  • OpenMMLab AI实战营 第二课笔记 计算机视觉之图像分类算法基础
    OpenMMLabAI实战营第二课笔记计算机视觉之图像分类算法基础1.什么是图像分类?1.1问题的数学表示1.2视觉任务的难点1.2.1超越规则:让机器从数据中学习1.2.2机......
  • 学习方法:认知的本质
    学习方法:认知的本质   “认知”,是学习的核心环节。“认知”的深度和广度,决定学习效果的好和坏。   “认知”,是探索“事和物运行的本质规律”。认知,......
  • Jmeter学习:接口测试参数化后循环断言不同内容的方法
    方法一:一:参数化接口测试数据  设置线程组迭代次数实现循环。二:添加配置元件-计数器拼接函数,嵌套变量 这个是jmeter自带的函数,可以用用这个函数进行字符串的......
  • 【Matlab学习2.5】稀疏矩阵
    矩阵的存储方式完全存储方式:将矩阵的全部元素按列存储。稀疏存储方式:只存储矩阵的非零元素的值及其位置,即行号和列号。注意,采用稀疏存储方式时,矩阵元素的存储顺序并没有......