一、#16:最接近的三数之和
这个题目虽然是中等题,但是没啥难度,用最基础的for三连遍历全部,找出绝对值最小的和与目标的差就可以了
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int i,j,k;
int res=0;
int min=abs(nums[0]+nums[1]+nums[2]-target);
if(nums.size()==3)
{
return nums[0]+nums[1]+nums[2];
}
for(i=0;i<nums.size();i++)
for(j=i+1;j<nums.size();j++)
for(k=j+1;k<nums.size();k++)
{
int temp=nums[i]+nums[j]+nums[k];
if(min>(abs(temp-target))||min==(abs(temp-target)))
{
min=abs(temp-target);
res=temp;
}
}
return res;
}
};
二、#17:电话号码的字母组合
题目要求,输入2-9数字的字符串,输出对应到电话号码的字母组合
拿到题目,就让我想到了树,顶是输入字符串的第一个数字,然后逐个往下组合,直到遍历,既然用到了树,那么就会想到用递归,一层层嵌套是这个题目非常简单且容易想到的方法
首先我们要建立一个二维向量vector<string> v;这个方法在之前有提到过,行符合vector的性质,列符合string的性质,我们现在可以根据输入的大小来无限扩充行,所以行咱们不用考虑,关键的是列,也就是每个string怎么取得,自顶向下的树的遍历就变得很重要咯
这里用到的几个操作进行分享一下,digits[index]-'0'可以吧数字字符串转化为数字,具体可以参照十六进制得到结果,这是一个小技巧,还有就是在函数内部提前写return 就可以在我们想要函数退出的地方进行退出
递归很大的一个特点是,一定要写好for语句哈哈哈哈,因为会一直在里面循环
for(int i=0;i<str[digits[index]-'0'-2].size();++i)
{
s+=str[digits[index]-'0'-2][i];
find(index+1,s,digits);
s.pop_back();
}
我设置这部分为插入递归的部分,当数字为2的时候,就会利用str[0]进行限制遍历长度,每一列则是需要添加到结果中的字母,首先添加一个,然后通过递归再找下一列的数字,直到满足
if(s.size()==digits.size())
{
v.push_back(s);
return;
}
则寻找完毕需要答案中的一列,return跳出当前递归层,并pop_back这一列的最后一个数字,再进行遍历,直到所有情况都被找到,递归是很节约空间的一种方式,但是运行时间有点凉,不过做出来为第一要务嘻嘻嘻
下面贴全部代码:
class Solution {
public:
string str[8]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
vector<string> v;
vector<string> letterCombinations(string digits) {
if(digits.size()==0) return v;
string s="";
find(0,s,digits);
return v;
}
void find(int index,string s,string digits){
if(s.size()==digits.size())
{
v.push_back(s);
return;
}
for(int i=0;i<str[digits[index]-'0'-2].size();++i)
{
s+=str[digits[index]-'0'-2][i];
find(index+1,s,digits);
s.pop_back();
}
}
};
三、与我宝研究正则辣个题目,失败嘻嘻嘻
这个题目到底是困难级别的,就是骚气,惹不起惹不起,我们以后只做简单和中等!!!
四、论文
把昨天尾巴看完并又找了几篇,明儿继续,感觉有一篇很重要!