#Leetcode每日不知道多少题之脑筋转不转?

A.  求众数

        给定一个大小为 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

        你可以假设数组是非空的,并且给定的数组总是存在众数。

        示例 1:

        输入:[3,2,3]

        输出:3

        示例 2:

        输入:[2,2,1,1,1,2,2]

        输出:2

分析:

    这里有一个叫做摩尔投票法的方法,用于求众数。是一种非常优秀的方法。这种投票法先将第一个数字假设为众数,然后把计数器设为1,比较下一个数和此数是否相等,若相等则计数器加一,反之减一。然后看此时计数器的值,若为零,则将当前值设为候选众数。以此类推直到遍历完整个数组,当前候选众数即为该数组的众数。

    这种算法的核心是:在任何数组中,出现次数大于该数组长度的一半的数字只能有一个。

    那么如果计数器减为零的话,就说明当前这个数肯定没有到达当前数组长度的一半,那么肯定不是要找的众数,那么就舍去(以后如果还有这个数的话,那么计数器一定不为0)

    由此得解。


代码:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int cnt = 0;
        int ans = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            if(cnt == 0)
            {
                ans = nums[i];
                cnt++;
            }
            else 
            {
                ans == nums[i]?cnt++:cnt--;
            }
        }
        return ans;
    }
};

    

B.  只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

            你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

    输入:[2,2,1]

    输出:1

示例 2:

    输入:[4,1,2,1,2]

    输出:4

分析:

    emmmm...其实Leetcode上面好多题都可以暴力......但是这道题你看,明确告诉你了除了一个元素外,其他的元素都出现了两次。两次是个啥意思?就是可以通过一定方式抵消的意思啦!

    那么学过的知识中,异或可以抵消两个相同的数字!那就分分钟秒杀好了!

   然而做题的时候并没有秒杀。。。自行百度了。。。。。。宛如智障般的存在这就是我了hhh


代码:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            ans ^= nums[i];
        }
        return ans;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值