程序员面试最难的部分就是手写代码,手写代码测试不但能够考察算法运用能力,思维能力,还能看出代码编写习惯。
想去大厂,还是需要及早刷题,这次有机会参与读算法。
本节是书中的第二章,分治法。
图书试阅读地址
https://www.epubit.com/onlineEbookReader?id=fb652b37-b7a6-4843-a933-5ed68b2395c1
算法知识点
分治的本质是将问题分为若干个小问题。
其实分治算法介绍的文绉绉的,我觉得简单的来说,就是算法里面的递归。
比如书里介绍的二分法搜索,文章中的实现并没有用到递归,但是实际上可以写成递归。
相关算法题型题目总结
分治算法题目挺多,包括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