首页 > 编程语言 >LeetCode算法—分治法

LeetCode算法—分治法

时间:2024-09-13 16:25:28浏览次数:7  
标签:right return nums max sum 分治 算法 LeetCode left

思路:分治法的核心思想是“分而治之”,即将一个复杂的问题分成多个较小的子问题,分别求解这些子问题,然后将子问题的解合并,得到原问题的解。具体到求众数的问题上,分治法通过递归地将数组分成两部分,分别找出每一部分的众数,最后通过合并步骤来确定整个数组的众数。

LeetCode

169多数元素

#方法1 分治递归解决-5.3%
class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        def majority_element_rec(start, end):
            if start == end:
                return nums[start]
            
            mid = (start + end) // 2
            left_majority = majority_element_rec(start, mid)
            right_majority = majority_element_rec(mid + 1, end)
            
            if left_majority == right_majority:
                return left_majority
            
            return max([left_majority, right_majority], key=nums[start:end + 1].count)
        
        return majority_element_rec(0, len(nums) - 1)
#方法2 哈希表-5.4%
class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        hash_map={}
        for i in nums:
            if i in hash_map:
                hash_map[i]+=1
            else:
                hash_map[i]=1

        for key,value in hash_map.items():
            if value>len(nums)/2:
                return key
#方法3 排序-97%(效率最高)
class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        nums.sort()
        return int(nums[len(nums)//2])

53 最大数组和

#方法1 动态规划
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        # 初始化 max_current 和 max_global 为数组的第一个元素
        max_current = max_global = nums[0]
        # 从第二个元素开始遍历
        for num in nums[1:]:
            # 更新当前子数组的最大和
            max_current = max(num, max_current + num)
            # 更新全局最大子数组的和
            max_global = max(max_global, max_current)
        return max_global
 #方法2 分治法-不推荐
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        def find_max_subarray(nums, left, right):
            # 基础情况:只有一个元素时
            if left == right:
                return nums[left]
            mid = (left + right) // 2
            # 递归地求左半部分和右半部分的最大子数组和
            left_max = find_max_subarray(nums, left, mid)
            right_max = find_max_subarray(nums, mid + 1, right)
            # 计算跨越中点的最大子数组和
            cross_max = find_cross_max_subarray(nums, left, mid, right)
            # 返回三者中的最大值
            return max(left_max, right_max, cross_max)
        def find_cross_max_subarray(nums, left, mid, right):
            # 从中点向左计算最大子数组和
            left_sum = float('-inf')
            curr_sum = 0
            for i in range(mid, left - 1, -1):
                curr_sum += nums[i]
                left_sum = max(left_sum, curr_sum)
            # 从中点向右计算最大子数组和
            right_sum = float('-inf')
            curr_sum = 0
            for i in range(mid + 1, right + 1):
                curr_sum += nums[i]
                right_sum = max(right_sum, curr_sum)
            # 跨越中点的最大子数组和
            return left_sum + right_sum
        return find_max_subarray(nums, 0, len(nums) - 1)

标签:right,return,nums,max,sum,分治,算法,LeetCode,left
From: https://www.cnblogs.com/gsupl/p/18412410

相关文章

  • LeetCode 692.前K个高频单词
    LeetCode692.前K个高频单词C++思路......
  • 【LeetCode Hot 100】1. 两数之和
    题目描述显然,最简单和直接的想法是使用暴力枚举:使用双重循环枚举符合条件的下标对并返回。这种方法的时间复杂度是平方级别\(O(N^2)\)。对于每个确定的数x,我们需要找到target-x对应的下标,暴力枚举方法使用的是直接遍历,这个操作的复杂度是线性的,而如果我们使用哈希表将元素及其......
  • 基于MATLAB蚁群算法优化的小波变换图像压缩
    随着计算机技术和网络速度的飞速发展,数字图像越来越成为人们生活中不可或缺的一部分,然而由于存储和传输的限制,如何对数字图像进行高效压缩成为了研究的热点问题,小波变换作为一种基于多尺度分析的信号处理方法,在数字图像压缩中有着广泛的应用。然而传统的小波变换图像压缩方法......
  • 决策树算法上篇
    决策树概述决策树是属于有监督机器学习的一种,起源非常早,符合直觉并且非常直观,模仿人类做决策的过程,早期人工智能模型中有很多应用,现在更多的是使用基于决策树的一些集成学习的算法。示例一:上表根据历史数据,记录已有的用户是否可以偿还债务,以及相关的信息。通过该数据,构建......
  • Python与Go语言中的哈希算法实现及对比分析
    哈希算法是一种将任意大小的数据输入转化为固定大小的输出(通常为一个散列值)的算法,在密码学、数据完整性验证以及数据索引等场景中广泛应用。本文将详细介绍Python和Go语言如何实现常见的哈希算法,包括MD5、SHA-1、SHA-256等。文章不仅提供代码示例,还会详细解释每个算法的特点、应用......
  • 复合Simpson求积算法-C++【可直接复制粘贴/欢迎评论点赞】
    背景复合Simpson求积算法是基于Simpson1/3法则的推广。Simpson1/3法则是一种数值积分方法,它通过将积分区间划分为多个小区间,并在每个小区间上采用一个二次多项式来逼近原函数,进而求得积分的近似值。复合Simpson求积算法则是将这种方法应用于整个积分区间,即将整个区间划分为......
  • C# 开源教程带你轻松掌握数据结构与算法
    前言在项目开发过程中,理解数据结构和算法如同掌握盖房子的秘诀。算法不仅能帮助我们编写高效、优质的代码,还能解决项目中遇到的各种难题。给大家推荐一个支持C#的开源免费、新手友好的数据结构与算法入门教程:Hello算法。项目介绍《HelloAlgo》是一本开源免费、新手友好的数......
  • 数据结构和算法之基本概念
    原文出处:数据结构和算法之基本概念  关注码农爱刷题,看更多技术文章!!其他文章:Java基础之数组    在计算机领域中,数据元素都不是孤立存在的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为结构(Structure)。数据结构是相互之间存在一种或多种特定关系的数......
  • 降维算法 0基础小白也能懂(附代码)
    降维算法0基础小白也能懂(附代码)原文链接啥是降维算法在互联网大数据场景下,我们经常需要面对高维数据,在对这些数据做分析和可视化的时候,我们通常会面对「高维」这个障碍。在数据挖掘和建模的过程中,高维数据也同样带来大的计算量,占据更多的资源,而且许多变量之间可能存在相关性......
  • 算法备案的一个流程是什么?
    一、备案系统注册及登录    算法备案填报人员在初次进入互联网信息服务算法备案系统时,需点击首页右下方的“填报人员入口”进行注册登录系统。二、主体信息填报    算法备案填报人员点击主页的“主体信息”,进行主体信息填报。按照备案主体的实际情况准确......