一、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是不能用了。。。太慢了
继续看论文吧,希望能得到启发