数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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;
}
};