版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liangdong2014/article/details/86226622
- 今天主要分享三道题
- Container With Most Water
- 题意:给一系列的高度为 的木板,彼此之间的距离为1个单位长度。问任选两个木板组成的容器面积最大是多少?
- 解法1:暴力,遍历所有组合,时间负责度是 ,代码如下:
- Container With Most Water
int maxArea(vector<int>& height) {
int size = height.size();
int res = 0;
for(int i=0;i<size;i++){
for(int j=i+1; j<size;j++){
int area = (j-i) * min(height[i], height[j]);
res = max(res, area);
}
}
return res;
}
- 解法2,我们知道组成的面积主要取决于两条边中较短的那一条。所以我们可以维护两个指针,分别从两端开始往内遍历,每次只更小较小的那一条边。往内更新是企图用高度来密度两个木板之间的距离。这个算法的时间复杂度是O(n).代码如下
int maxArea(vector<int>& height) {
int size = height.size();
int res = 0;
int r=0;
int l=size-1;
while(r < l){
int area = (l-r) * min(height[l], height[r]);
if(height[l] < height[r]){
l -= 1;
}
else{
r += 1;
}
res = max(res, area);
}
return res;
}
- 接下来两道题很相似,一道是阿拉伯数字转罗马数字,一道是罗马数字转阿拉伯数字。
- 阿拉伯数字转罗马数字,采用递归的思路,总是先转化成尽可能大的数字。比如说1234,我们就先转成1000=>M,然后再处理234->134->34->24->14->4->0;代码如下:
string intToRoman(int num){
string res = "";
if(num == 0){
return res;
}
if(num >= 1000){
res += "M";
num -= 1000;
res += intToRoman(num);
return res;
}
if(num >= 900){
res += "CM";
num -= 900;
res += intToRoman(num);
return res;
}
if(num >=500){
res += "D";
num -= 500;
res += intToRoman(num);
return res;
}
if(num >=400){
res += "CD";
num -= 400;
res += intToRoman(num);
return res;
}
if(num >=100){
res += "C";
num -= 100;
res += intToRoman(num);
return res;
}
if(num >=90){
res += "XC";
num -= 90;
res += intToRoman(num);
return res;
}
if(num >=50){
res += "L";
num -= 50;
res += intToRoman(num);
return res;
}
if(num >=40){
res += "XL";
num -= 40;
res += intToRoman(num);
return res;
}
if(num >=10){
res += "X";
num -= 10;
res += intToRoman(num);
return res;
}
if(num >=9){
res += "IX";
num -= 9;
res += intToRoman(num);
return res;
}
if(num >=5){
res += "V";
num -= 5;
res += intToRoman(num);
return res;
}
if(num >=4){
res += "IV";
num -= 4;
res += intToRoman(num);
return res;
}
if(num >=1){
res += "I";
num -= 1;
res += intToRoman(num);
return res;
}
}
- 罗马数字转阿拉伯数字。先从大的数字开始遍历。注意,我们要优先处理有两个字母的情况,比如400,900等。代码如下:
int romanToInt(string s) {
map<string, int> romanInt{
{"I", 1},
{"IV", 4},
{"V", 5},
{"IX", 9},
{"X", 10},
{"XL", 40},
{"L", 50},
{"XC", 90},
{"C", 100},
{"CD", 400},
{"D", 500},
{"CM", 900},
{"M", 1000},
};
int res = 0;
while(s.length()>0){
bool find_flag = false;
if(s.length() >= 2){
for(map<string, int>::iterator iterator1=romanInt.begin();iterator1 != romanInt.end(); iterator1++){
if(s.substr(0, 2) == iterator1->first){
res += iterator1->second;
s = s.substr(2);
find_flag=true;
break;
}
}
}
if(find_flag){
continue;
}
for(map<string, int>::iterator iterator1=romanInt.begin();iterator1 != romanInt.end(); iterator1++){
if(s.substr(0, 1) == iterator1->first){
res += iterator1->second;
s = s.substr(1);
break;
}
}
}
return res;
}