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

被折叠的 条评论
为什么被折叠?



