leetcode——找出超过一半数组长度的数

**方法一:正常思路可以先排序,再取中间值,中间值就是数组中出现次数超过一半的数字。

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        nums.sort()
        return nums[len(nums)//2]

方法二:不正常思路的话,用target记录上一次访问的值,count表明当前值出现的次数,如果
下一个值和当前值相同那么count++;如果不同count–,减到0的时候就要更换新的target值了,因为如果存在超过数组长度一半的值,那么最后target一定会是该值。可以这样理解,count的自加和自减就是在描述一种抵消关系,由于超过一半的出现次数,导致最后的target一定会是该值。(这种方法的时间复杂度自然会小些)

class Solution {
    public int majorityElement(int[] nums) {
        int target = nums[0];//初始化为数组的第一个元素,接下来用于记录上一次访问的值
		int count = 1;//用于记录出现次数
		for(int i = 1;i<nums.length;i++) {
			if(target == nums[i]) {
				count++;
			}else {
				count--;
			}
			if(count == 0) {//当count=0时,更换target的值为当前访问的数组元素的值,次数设为1
				target = nums[i];
				count = 1;
			}
		}
		return target;
    }
}
class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        target=nums[0]
        count=1
        for i in range(len(nums)):
            if target==nums[i]:
                count+=1
            else:
                count-=1
            if count==0:
                count=1
                target=nums[i]
        return target
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值