一、两数之和
思路:使用map记录值与下标+1。遍历数组,如果target-当前值,在map中,则直接返回。如果不在则将该值与下标记录到map.
class Solution {
public:
/**
*
* @param numbers int整型vector
* @param target int整型
* @return int整型vector
*/
vector<int> twoSum(vector<int>& numbers, int target) {
// write code here
map<int,int> m;
for(int i=0;i<numbers.size();i++)
{
int n = numbers[i];
//先查看之差是否在map
if (m[target-n] == 0)
{
m[n] = i+1;
}
else
{
vector<int> v2;
v2.push_back(m[target-n]);
v2.push_back(i+1);
return v2;
}
}
return vector<int>();
}
};
二、数组中超过数组长度一半的元素
解法一:因为这个数字出现的次数比其他数的总和还要多。那么,在遍历数组时保存两个值:一是数组中一个数字,一是次数。遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。遍历结束后,所保存的数字即为所求。然后再判断它是否符合条件即可。
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers)
{
if (numbers.empty())
{
return 0;
}
//保存值
int result = numbers[0];
//保存出现的次数
int times = 1;
for(int i=1;i<numbers.size();i++)
{
//如果times减到了0,则更换result.
if(times==0)
{
result=numbers[i];
times=1;
}
//如果与前一个值相同,则times++;
if (numbers[i] == result)
{
times++;
}else{
times--;
}
}
//校验result是否是要求的解。
times=0;
for(int i=0;i<numbers.size();i++)
{
if(numbers[i] == result){
times ++;
}
}
return times > numbers.size()/2 ?result:0;
}
};