昨儿浪了一天,今儿继续开始学习,日常LEETCODE,嘤嘤嘤竟然发现自己爱上了leetcode可真是神奇哦!当然还是有一堆题不会做,比如今天这道题……三数之和……研究怎么输出答案就研究了半天哈哈哈哈哈,最后参照了优快云、博客园和别人的大男输出部分,才写出来的!代码的主体功能已经实现了,但是因为指针瞎指导致的溢出问题,我没有继续写下去,还有一部分功能就是删除重复的答案,这个也比较简单……但是de不出来!!
算求了!
再费时间不值得了,学学别人的好啦!
我的思路就是先排序,再使用三个指针其实好像只用一个就行了,一个头一个尾,一个中间,保证三个指针不冲突就好。然后指定初始位置,三数之和分三类,每一大类中根据收指针之和分两类,注意的是每执行一次判断就要移动一下指针,防止矛盾!
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
vector<vector<int>> ans;
vector<int> v;
int *p;
int *q;
int *m;
sort(nums.begin(),nums.end());
int n=nums.size();
if(n<3)
return ans;
else{
*p=nums[0];*q=nums[n-1];*m=nums[1];
if(nums[0]+nums[n-1]<0||nums[0]+nums[n-1]>0)
return ans;
else {
while(p<q)
{
if(*p+*q+*m>0)
{if(*p+*q>0)
{q--;}
else m++;
}
else if(*p+*q+*m<0)
{ if(*p+*q<0)
{p++;m++;}
else m++;}
else if(*p+*q+*m==0)
{v.push_back(*p);
v.push_back(*m);
v.push_back(*q);
ans.push_back(v);
p++;
m=++p;
}
else if(m==q)
{m=++p;p++;}
}
}
}
return ans;
}
};
还有之前不会的就是[ [1,0,-1],[-2,1,1] ]这种形式的vector,也是百度才知道怎么用,首先是定义vector<vector<int>> ans,后面又定义了vector<int>v,目的是先将指针内容放进v中,再将一组v放进ans中,是不是很神奇??
哈哈哈反正我这个也没写完,学习一下大佬的代码吧!
代码出处:https://blog.youkuaiyun.com/free_dom_/article/details/89317499
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int> > result;
if(nums.size()<3)
return result;
sort(nums.begin(),nums.end());
map<int,int> m;
set<vector<int> > se;
int minNum=nums[0],
maxNum=nums[0];
for(int i=0;i<nums.size();i++){
minNum=min(minNum,nums[i]);
maxNum=max(maxNum,nums[i]);
m[nums[i]]=i;
}
if(maxNum==minNum){
if(minNum==0){
vector<int> t;
t.push_back(0);
t.push_back(0);
t.push_back(0);
result.push_back(t);
}
return result;
}
if(maxNum<0||minNum>0){
return result;
}
map<int,int>::iterator it;
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<nums.size();j++){
if(i<j){
if(nums[i]+nums[j]+minNum>0||nums[i]+nums[j]+maxNum<0){
continue;
}
it=m.find(-(nums[i]+nums[j]));
if(it!=m.end()&&it->second>j){
vector<int> t;
t.push_back(nums[i]);
t.push_back(nums[j]);
t.push_back(it->first);
se.insert(t);
}
}
}
}
set<vector<int> >::iterator sit=se.begin();
for(;sit!=se.end();sit++){
result.push_back(*sit);
}
return result;
}
SPC二值化分割法
就是利用统计学原理中的正态分布,这个式子,μ是灰度平均值,k自己选,
是灰度标准差,这样挑选的阈值是一个有上下限的阈值,更具有灵活性。
最小外接矩形
https://blog.youkuaiyun.com/abc8730866/article/details/68944241
随机森林
https://www.cnblogs.com/maybe2030/p/4585705.html
参考的这篇文章……又把关于机器学习的基础知识过了一遍,奇怪的是没有提到过这个随机森林……就专门查了一下,了解一条,体会一下,感受一下。
Random Forest,简称RF。随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。优缺点什么的现在就讨论还为时过早,毕竟要真正遇到问题时候才可以对症下药。详见上面的链接哈哈哈。
集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。就好比大家用不同方法做这一道题,9个人做出来是1,一个人是2那答案就有90%的概率是2啦!这也就是集成学习的优点之一——准确率高!
值得考虑的是每棵树的生成,文章里提到每棵树都是随机且有放回的选择部分样本,且每棵树最大自由度的自由生长,没有剪枝过程。这样能够使得树之间的相关性最低,以此来降低错误率。
袋外错误率oob error(out-of-bag error),是很重要的无偏估计。就是每棵树选中的样本以外的样本称为这棵树的袋外(oob)样本。oob计算思路就是选择一棵树,计算它成为袋外样本时的预测结果,少数服从多数,即多数情况下的预测成果视为真值,其余的为错误之,计算错误时候所占的比率,它的结果近似于需要大量计算的k折交叉验证。
那随机森林和树的最大差别是什么呢?百度吧,姐妹!
我查了一下,就是树是一个一个特征进行处理,是用树的结构来构建分类模型,每个节点代表着一个属性。而决策树是对每个训练集构建一棵决策树,在特征中随机抽取一部分特征,在抽到的特征中找到最优解,应用到节点进行分类。就好比决策树要找出439中最厉害的人物,大树说我要找最聪明的作为最优解,我觉得是包子的大猪蹄厉害!森林说我要找最帅的、在找最聪明的!于是森林里的两棵树就找啊找,发现最帅的是大猪蹄,最聪明的也是大猪蹄,所以得出结论:439最厉害的就是大猪蹄!!
代码看了一些,唉,看不懂哦!再说~~