描述
给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
数据范围:n≤50000,数组中元素的值 0≤val≤10000
要求:空间复杂度:O(1),时间复杂度 O(n)
输入描述:
保证数组输入非空,且保证有解
思路:如果没有时间复杂度的要求,我们可以把元素排列,处于中间位置的元素一定是超过一半的元素,但是库中的快排时间复杂度是O(NlogN),因此虽然代码简短但不是所求
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
sort(numbers.begin(),numbers.end());
return numbers[numbers.size()/2];
}
};
思路:这道题目比较好的思路就是利用众数的思想,让第一个数作为基准,然后下一个数和这个基准比较,如果相等那就标记count++,如果不相等就count--,一旦count变为0,就下下一个数上来
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int base=numbers[0];
int count=1;
for(int i=1;i<numbers.size();i++)
{
if(numbers[i]==base)
count++;
else
{
count--;
if(count==0)
{
base=numbers[++i];
count=1;
}
};
}
return base;
}
};
代码变复杂但是节约了时间也没有额外的空间消耗
上面两个代码均认为题目所给测试用例是正确的,判错暂未给出
一道很水的题
描述
A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息:
A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.
现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C。这里保证最多只有一组整数A,B,C满足所有题设条件。
输入描述:
输入为一行,一共4个整数,分别为A - B,B - C,A + B,B + C,用空格隔开。 范围均在-30到30之间(闭区间)。
输出描述:
输出为一行,如果存在满足的整数A,B,C则按顺序输出A,B,C,用空格隔开,行末无空格。 如果不存在这样的整数A,B,C,则输出No
#include <iostream>
using namespace std;
int main()
{
int a=0;
int b=0;
int c=0;
int d=0;
cin>>a>>b>>c>>d;
int A=(a+c)/2;
int C=(d-b)/2;
int B1=(c-a)/2;
int B2=(b+d)/2;
if(B1==B2)
cout<<A<<" "<<B1<<" "<<C;
else
cout<<"No";
return 0;
}