14天阅读挑战赛——分治法(一)

14天阅读挑战赛

程序员面试最难的部分就是手写代码,手写代码测试不但能够考察算法运用能力,思维能力,还能看出代码编写习惯。
想去大厂,还是需要及早刷题,这次有机会参与读算法。
本节是书中的第二章,分治法。

图书试阅读地址
https://www.epubit.com/onlineEbookReader?id=fb652b37-b7a6-4843-a933-5ed68b2395c1

算法知识点

分治的本质是将问题分为若干个小问题。

其实分治算法介绍的文绉绉的,我觉得简单的来说,就是算法里面的递归。
比如书里介绍的二分法搜索,文章中的实现并没有用到递归,但是实际上可以写成递归。

相关算法题型题目总结

分治算法题目挺多,包括leetcode上面也有很多。我本身算法功底,数学功底还是偏弱,短时间内可能不适合看难题。本节就看一下中等难度的题目是怎么样的。

算法题目描述

leetcode-寻找多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入:nums = [3,2,3]
输出:3
示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2

题目分析

作为一个小菜鸡程序员,看到题目内心os:就这还中等难度?不就是for循环的事嘛。
当然暴力解决肯定可以,就是不优雅。
运用分治我们怎么做这个题目呢?
在这里插入图片描述

不断从数组的中间进行递归分割,直到每个区间的个数是1,然后向上合并左右区间个数较多的数,向上返回。

这一点如果想清楚了,这道题就好办了。

模板代码

class Solution:

    def findMajorityElement(self, nums: list) -> int:
        if len(nums) == 1:
            return nums[0]
        left = self.findMajorityElement(nums[:len(nums)//2])
        right = self.findMajorityElement(nums[len(nums)//2:])
        if left == right:
            return left
        elif nums.count(left) > nums.count(right):
            return left
        else:
            return right

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值