leetcode day9 Majority Element

本文深入探讨Python字典的使用技巧,包括创建、提取、遍历及使用不可变对象作为键值。同时,介绍了摩尔投票算法,这是一种高效查找数组中出现次数超过一半的元素的方法,具有O(n)的时间复杂度和O(1)的空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Python的知识
字典的使用:
1、创建:dict[key] = value
2、根据关键字提取相关值:

  1. value = dict[key] ——这种方法如果不存在相关key的话会返回错误
    ######## 判断key是否存在 if key in dict 这样
  2. value = dict.get(key, set_value)——如果不存在相关key,会返回设定值

3、字典的key只能使用不可变对象,字符串和整数是不可变对象,而list是可变对象,因此list不可作为key值:
再议不可变对象
上面我们讲了,str是不变对象,而list是可变对象。

对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如:

a = [‘c’, ‘b’, ‘a’]
a.sort()
a
[‘a’, ‘b’, ‘c’]
而对于不可变对象,比如str,对str进行操作呢:

a = ‘abc’
a.replace(‘a’, ‘A’)
‘Abc’

a
‘abc’
虽然字符串有个replace()方法,也确实变出了’Abc’,但变量a最后仍是’abc’,应该怎么理解呢?

我们先把代码改成下面这样:

a = ‘abc’
b = a.replace(‘a’, ‘A’)
b
‘Abc’

a
‘abc’
要始终牢记的是,a是变量,而’abc’才是字符串对象!有些时候,我们经常说,对象a的内容是’abc’,但其实是指,a本身是一个变量,它指向的对象的内容才是’abc’:

a-to-str

当我们调用a.replace(‘a’, ‘A’)时,实际上调用方法replace是作用在字符串对象’abc’上的,而这个方法虽然名字叫replace,但却没有改变字符串’abc’的内容。相反,replace方法创建了一个新字符串’Abc’并返回,如果我们用变量b指向该新字符串,就容易理解了,变量a仍指向原有的字符串’abc’,但变量b却指向新字符串’Abc’了:

a-b-to-2-strs

所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。

摘自:廖雪峰的网站

4、取出dict的key和value:
for key, value in dict_count.iteritems()

二、 题目
描述:在数组中选出数目大于n/2的元素
思路:
1、我的思路比较简单,创建一个字典,key是相关元素,value是出现的次数,遍历返回大于n/2的key

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        i = 0
        dict_count = {}
        while i < len(nums):
            print i
            if nums[i] in dict_count:
                dict_count[nums[i]] += 1
            else:
                dict_count[nums[i]] = 1
            i += 1
        for key, value in dict_count.iteritems():
            if value > len(nums)/2:
                return int(key)
        return None

2、排序:把列表中的元素按升序或者降序排列,返回中间值。排序的复杂度是nlogn,返回是1,因此这也是比较好的一种方法。
3、二分法:对于左右两边,分别计算,这样的复杂度是nlogn

class Solution(object):
    def majorityElement(self, nums):
        return self.major_devide(0, len(nums)-1, nums)
    def major_devide(self, lo, hi, nums):
        if lo == hi:
            return nums[lo]        
        mid = (hi-lo)//2 + lo
        left = self.major_devide(lo, mid, nums)
        right = self.major_devide(mid+1, hi, nums)
        
        if left == right:
            return left
        
        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 right_count < left_count else right
    

4、二、摩尔投票算法:摩尔投票算法的时间和空间都很低,时间复杂度为O(n),空间复杂度为O(1),这也是选择遮盖算法的原因。算法原理:每次从数组中找出一对不同的元素,将它们从数组中删除,直到遍历完整个数组。由于这道题已经说明一定存在一个出现次数超过一半的元素,所以遍历完数组后数组中一定会存在至少一个元素。
算法在局部变量中定义一个序列元素(m)和一个计数器(i),初始化的情况下计数器为0;
算法依次扫描序列中的元素,当处理元素x的时候,如果计数器为0,那么将x赋值给m,然后将计数器(i)设置为1;
如果计数器不为0,那么将序列元素m和x比较,如果相等,那么计数器加1,如果不等,那么计数器减1。
处理之后,最后存储的序列元素(m),就是这个序列中最多的元素。
(如果不确定是否存储的元素m是最多的元素,还可以进行第二遍扫描判断是否为最多的元素)

class Solution(object):
    def majorityElement(self, nums):
        i_flag = nums[0]
        i_count = 0
        i = 0
        while (i < len(nums)):
            if i_count == 0:
                i_flag = nums[i]
            if nums[i] != i_flag:
                i_count -= 1
            else:
                i_count += 1 
            i = i + 1
        return i_flag
    

作者:yealxxy
来源:优快云
原文:https://blog.youkuaiyun.com/u014248127/article/details/79230221
版权声明:本文为博主原创文章,转载请附上博文链接!

#这些代码我都是后面补上补上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值