《剑指offer》数组中出现次数超过一半的数字、斐波那契序列(动态规划)

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

思路:1.只有一个数字出现的次数大于一半,如果设数组N个,那么多出现的数字次数为M,那么M - N/2 >0,这表明,用这个数字的出现次数减去其他所有数字的出现次数,结果大于0。2

2.第一个思路:顺序遍历,两个数字不同就删除,多来几次,最好的结果就是那个数,但是可能循环的次数太多了

3.第二思路:用一个数临时存储数的出现次数,如N进行记录,如果数字相同,则N++,反之N--,最后得到的数就可能是结果,最后循环一次,检测这个数出现的次数大于1/2即可。

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
    int num=1;int tempNum=numbers[0];
        for(int i=1;i<numbers.size();i++)
        {
            if(num==0)
            {
                tempNum=numbers[i];
                num=1;
                continue;
            }
            if(tempNum!=numbers[i])
                num--;
            else
                num++;
        }
        int temp=0;
        for(int i=0;i<numbers.size();i++)
        {
            if(numbers[i]==tempNum)
                temp++;
        }
        if(temp>numbers.size()/2)
            return tempNum;
        else
            return 0;
    }
};

2.斐波那契(动态规划)

思路:动态规划:状态的转变,记录上一状态,通过运算得出下一状态。斐波那契 f(n) = f(n-1)+f(n-2);那么记录n-1、n-2得出n即可。

class Solution {
public:
    int Fibonacci(int n) {
        if(n==0)
            return 0;
        if(n==1)
            return 1;
        int num0=1;
        int num1=0;
        int num=0;
        while(n>1)
            {
            num=num1+num0;
            num1=num0;
            num0=num;
            n--;
        }
        return num;
    }
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值