今日小结——20190412(LeetCode日常+结构光光栅投影学习)

一、LeetCode刷题

1.#11:盛水最多的容器

题目要求:输入一个数组,找到两个数组值表示的高度与X轴围成面积的最大值

题目比较好理解,就是求面积最大值嘛,而且是竖条围城的容器,就可以直接开始写了(这道题应该放到简单难度。。。)

首先第一点肯定是要了解输入量和输出量是个啥,输入量是一个数组,表示竖条的高度,输出量是面积,那么我们就用常规的双循环对比的方法,两个for语句,遍历所有的数组元素,每一次遍历,就要算一次面积,保留下来max_area,直到数组元素遍历完成,思路很简单,运行代码也没有错误,但是呢,提交时候就出现了用时超时。。。看了一下系统的编译测试过程,50个测试用例,最后一个15000个数的测试用例超时,由此可见,算法正确的情况下,也得考虑时间问题,for双循环只能用来解决小输入,对于大输入还是太费时间了,效率极低。。。

然后上面这个方法就抛弃了,还是老老实实的用“五五开”方法,也就是首尾一起向中间靠拢,这样类似于二分法,可以大大降低运算时间,因为LeetCode包含所有的头文件,我就恬不知耻的偷懒的用了min,max两个函数(虽然自己写也比较简单),具体思路就是设定数组的头元素和尾元素,然后用头尾构成的最小矩形算面积和当前最大值,后面就是头尾元素移位继续比较面积大小了。这里为了减少运算,可以思考一下,什么样的情况不需要发生头尾元素移位?如果移位后,高度增加,那么可能发生面积反超刚才面积的情况,如果高度减小,那么势必不可能超过!想到这里,就可以不用每次计算完面积都头尾元素移位,仅仅需要移位的是相对小的元素~代码如下,比较简洁:

class Solution {
public:
    int maxArea(vector<int>& height) {
        int area = 0;
        int *head = &height[0],*tail = &height[height.size()-1];
        while(head != tail)
        {
        	int temp = min(*head,*tail) * (tail-head);
        	area = max(temp,area);
        	(*head >= *tail) ? tail-- : head++;
        }
        return area;
    }
};

2.#12:整数转罗马数字

题目要求就不解读了,很好理解~直接解题

首先要考虑到,这是不是就是一个分段函数问题,不同的数字段有不同的罗马数字输出规律,那么最暴力的解法就是直接强行分类做,分个10类左右就做出来了。。。(也还好,锻炼细心的能力),但是我懒,还是想想有啥懒人解法,我们可以吧分段函数问题再继续轻量化,考虑到减法操作需要在左边添加字符,所以我吧减法操作字符统一起来,比如40就写成XL,这样可以利用string的特性,直接在后面添加字符就好了,最后关键的东西来了,就是利用我常用的整除取余方法,把分类的元素排列起来:

        int arr[12]={1000,900,500,400,100,90,50,40,10,9,5,4};
        string Rome_num[12] = {"M", "CM","D","CD","C","XC","L","XL","X","IX","V","IV"};

 arr和Rome_num对应起来,方法类似于提取一个数的个十百千位,也就是通过整除判断大于1000的数字,string中加“M”,剩下部分用余数来表示,余数如果大于900,那么再在string中加“CM”,以此类推,因为小于4的数,不符合这个算法,就单独拿出来在最后进行string补充,细节比较多,代码如下:

 

class Solution {
public:
    string intToRoman(int num) {
        string str="";
        int arr[12]={1000,900,500,400,100,90,50,40,10,9,5,4};
        string Rome_num[12] = {"M", "CM","D","CD","C","XC","L","XL","X","IX","V","IV"};
        for(int i=0;i<12;i++)
        {
            if(num/(arr[i])>0)
            {
                for(int j=0;j<num/(arr[i]);j++)
                {
                    str+=Rome_num[i];
                }
                
                num=num%(arr[i]);
            }
            else
            {
                continue;
            }
        }
        for(int k=0;k<num;k++)
        {
            str+='I';
        }
        
        return str;
    }
};

 

 二、结构光光栅投影学习

项目原因,现在需要用光栅投影仪+CCD进行缺陷零件的拍摄+处理,这方面空白,所以抓紧学习。

首先参考其他论文中使用结构光方法标定、拍摄、采集、处理的方法,光栅编码方法有直接编码,时分复用编码和空分复用编码,总的来说,时分复用编码最贴合项目场景,测量精度高,分辨率高,受物体颜色影响小,是一种很好的方法,但是因为识别一个编码点需要计算N次投影点,计算量较大,实际情况再调整吧。

前天想的用深度相机。。。算了吧,还是老老实实用CCD加投影仪自己标定加处理吧。。。

现有论文比较少,开始看到了线结构光,但是此方法后期处理需要用点云拼接来和CAD模型进行配准,放弃~

说到底还是用光栅!

但是目前看到的和想到的,只能用相位法去识别出缺陷有无,但是分类怎么做。。。?用结构光得到的图+SVM进行一个简单分类?好像也可以,反正那天看的KNN是不能用了。。。太慢了

继续看论文吧,希望能得到启发

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值