2019-04-23学习笔记
今儿和昨儿一起总结吧,鉴于昨天学的实在是少了些……
首先是leetcode的题——盛水最多的容器,显然我用了最笨的方法,时间必然不能通过……看了答案是动态规划,噫,这是个什么鬼……
我的辣鸡代码……
class Solution { public: int maxArea(vector<int>& height) { int num=height.size(); int area;int ans=0; for(int i=0;i<num;i++) { for(int j=i+1;j<num;j++) { area=(j-i)*min(height[i],height[j]); ans=max(ans,area); } } return ans; } };
感觉动态规划好玄幻……看到一个不是动态规划的,但是类似??就是两个指针分别置于两端,移动的同时记录一下面积,两个指针中,值较小的向内移动,所以就是++i或者是--j……
大神的答案如下……
1 class Solution { 2 public: 3 int maxArea(vector<int>& height) { 4 if(height.size() <= 1) return -1; 5 int i = 0, j = height.size() - 1, res = 0; 6 while(i < j){ 7 int h = min(height[i], height[j]); 8 res = max(res, h * (j - i)); 9 if(height[i] < height[j]) ++i; 10 else --j; 11 } 12 return res; 13 } 14 };
这道题真的非常有趣!大概有助于提高智商吧……
第二道题是Int trans to Roma……
老娘的笨方法居然通过了,成果还行……但是估计客户经理看了想打人……
1 class Solution { 2 public: 3 string intToRoman(int num) 4 { 5 if(num<1||num>3999) 6 return 0; 7 int a[4]; 8 string ans; 9 a[0]=num/1000; 10 for(int i=0;i<a[0];i++) 11 {ans+='M';} 12 num=num-a[0]*1000; 13 a[1]=num/100; 14 if(a[1]<4) 15 {for(int j=0;j<a[1];j++) 16 {ans+='C';}} 17 else if(a[1]==4) 18 ans+="CD"; 19 else if(a[1]>=5&&a[1]<9) 20 { 21 ans+='D'; 22 for(int m=0;m<a[1]-5;m++) 23 {ans+='C';} 24 } 25 else if(a[1]==9) 26 ans+="CM"; 27 num=num-a[1]*100; 28 a[2]=num/10; 29 if(a[2]<4) 30 {for(int j=0;j<a[2];j++) 31 {ans+='X';}} 32 else if(a[2]==4) 33 ans+="XL"; 34 else if(a[2]>=5&&a[2]<9) 35 { 36 ans+='L'; 37 for(int n=0;n<a[2]-5;n++) 38 {ans+='X';} 39 } 40 else if(a[2]==9) 41 ans+="XC"; 42 a[3]=num-a[2]*10; 43 if(a[3]<4) 44 {for(int j=0;j<a[3];j++) 45 {ans+='I';}} 46 else if(a[3]==4) 47 ans+="IV"; 48 else if(a[3]>=5&&a[3]<9) 49 { 50 ans+='V'; 51 for(int p=0;p<a[3]-5;p++) 52 {ans+='I';} 53 } 54 else if(a[3]==9) 55 ans+="IX"; 56 return ans; 57 } 58 };
然后照例看看大神的答案,十行不到吊打我六十行!!
帅气!!
1 class Solution { 2 public: 3 string intToRoman(int num) { 4 int values[]={1000,900,500,400,100,90,50,40,10,9,5,4,1}; 5 string reps[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}; 7 string res; 8 for(int i=0; i<13; i++){ 9 while(num>=values[i]){ 10 num -= values[i]; 11 res += reps[i]; 12 } 13 } 14 return res; 15 } 16 };
之前听人说,法语中的84是两个四十加四个一这样类似,英文一万三是一三个一千……大概还是地地道道的中国人吧,还是个十百千万的数数,对于转换罗马字符这种,更像是加减运算,减去一个1000,减去一个900……学习一下……然后建立两个数组,对应添加元素,感觉好聪明啊!比if语句排排坐好多了……
看了看论文中的图像算法中的空间域和频域的转换……理解不了……大概只知道通过转化为能量分布形式,能检测出基频和高频,有助于选择阈值???区分背景和杂物??我理解的就这个层面了……那个作者后面也是写了阈值的选择……
最大类间方差阈值分割法
意思大概是统计出各个灰度i出现的概率pi,设定一个阈值t,i=0~t时,属于A类,t~255属于B类,然后分别计算A类和B类中的平均灰度以及全局灰度,然后计算A和B中的类间方差,多试几次t之,选择最大类间方差,即为能将背景和主体分清的最佳阈值。数学知识放在下面那张图上面了……都是概率论的知识……
二维最大熵阈值分割方法
这个我看不懂……明儿细查查……
