|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大佬们, 萌新最近在刷题, 看到一个答案用了分治法 有点看不懂,求大佬们帮忙解释一下啊:
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
class Solution:
def majorityElement(self, nums, lo=0, hi=None):
def majority_element_rec(lo, hi):
# base case; the only element in an array of size 1 is the majority
# element.
if lo == hi:
return nums[lo]
# recurse on left and right halves of this slice.
mid = (hi-lo)//2 + lo
left = majority_element_rec(lo, mid)
right = majority_element_rec(mid+1, hi)
# if the two halves agree on the majority element, return it.
if left == right:
return left
# otherwise, count each element and return the "winner".
left_count = sum(1 for i in range(lo, hi+1) if nums[i] == left)
right_count = sum(1 for i in range(lo, hi+1) if nums[i] == right)
return left if left_count > right_count else right
return majority_element_rec(0, len(nums)-1)
问题:上边定义的lo和hi分别指的什么啊? mid 又是什么啊?? mid = (hi-lo)//2 + lo 这个关系式是为了得到什么啊??? 呜呜呜呜 求大佬敲打我
代码有点错,原代码的结果只能返回列表最后一个元素,修改了一下,你要知道的内容,代码里有注释:
- class Solution:
- def majorityElement(self, nums, lo=0, hi=None): #lo是列表低位索引值,初始化就是0了,hi是列表高位索引值,要由len算出来,这里先赋值None,赋值为0也行
- def majority_element_rec(lo, hi):
- # 只剩一个元素时,返回元素
- if lo == hi:
- return nums[lo]
- # 数组切片位两等份进行递归运算
- mid = (hi-lo)//2 + lo #mid是算出的列表中间位索引值
- left = majority_element_rec(lo, mid) #对列表左半部分再运算
- right = majority_element_rec(mid+1, hi) #对列表右半部分再运算
- # 如果两部分元素相同,返回元素.
- if left == right:
- return left
- # 不相同,对比两部分元素并且返回“胜者”
- left_count = sum(1 for i in range(lo, hi+1) if nums[i] == left) #原代码有错,num改成num[i]
- right_count = sum(1 for i in range(lo, hi+1) if nums[i] == right) #原代码有错,num改成num[i]
- return left if left_count > right_count else right
- return majority_element_rec(0, len(nums)-1)
复制代码
|
|