Day6-多数元素

文章介绍了两种找到数组中多数元素的方法。第一种是通过对数组进行排序然后取中间元素,时间复杂度为O(nlogn),空间复杂度为O(1)。第二种方法是使用计数法,遍历数组并动态更新计数,当计数为0时更换目标元素,最后保留的元素即为多数元素,这种方法的时间复杂度为O(n),空间复杂度为O(1)。

法一:先排序,在取中间元素

解题思路:

时间复杂度:O(nlogn)

空间复杂度:O(1)

func majorityElement(nums []int) int {
    length:=len(nums)
    sort.Ints(nums)//sort.Int()快速排序的时间复杂度是nlg(n),所以这个函数也是nlg(n)
    return nums[length/2]
}

法二:计数

解题思路:

 用第一个数组元素nums[0]开始比较,从1开始记计数,如果出现和nums[0]相等的数,计数+1,即nums[0]出现的次数+1。若出现和nums[0]不等的数,计数-1,如果计数减到0,则数组索引值index改为下一个要计数的数组nums[i+1]。以此知道遍历完数组nums,最后得到的index值即为多数元素。

难点:这里可以这么理解,多出现另count值为0的元素时,说明之前的有可能不是多数元素,这时把对比的目标转向下一个元素,最终谁是一直在被对比的即为那个多数元素。

func majorityElement(nums []int) int{
	count:=1
	index:=nums[0]
	for i:=1;i<len(nums);i++{
		if nums[i]==index{
			count++
		}else{
			count--
			if count==0{
				index=nums[i+1]
			}
		}
	}
	return index
}

时间复杂度:O(n):n为数组长度

空间复杂度O(1) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值