2019-04-26周五宁波和杭州都下雨了,晚饭的鱼粉好大份哦,这是我第一次吃鱼粉!Hhhhhhhh下雨了就给吃点面才暖和,辛苦快递小哥哥了呀,其实这家店就在食堂我看见很多次了懒得买,外卖好像更便宜!

博主分享了在LeetCode上解决“三数之和”问题的经历,详细记录了从困惑到逐步理解并实现解决方案的过程。文章探讨了排序、指针技巧及避免重复答案的方法,同时对比了不同代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨儿浪了一天,今儿继续开始学习,日常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二值化分割法

就是利用统计学原理中的正态分布,\mu \pm k\sigma这个式子,μ是灰度平均值,k自己选,\sigma是灰度标准差,这样挑选的阈值是一个有上下限的阈值,更具有灵活性。

最小外接矩形μ\pm k\sigma

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最厉害的就是大猪蹄!!

代码看了一些,唉,看不懂哦!再说~~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值