[leetcode] RomanToInteger、IntegerToRoman和Container With Most Water

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liangdong2014/article/details/86226622
  • 今天主要分享三道题
    • Container With Most Water
      • 题意:给一系列的高度为 h i h_i 的木板,彼此之间的距离为1个单位长度。问任选两个木板组成的容器面积最大是多少?
      • 解法1:暴力,遍历所有组合,时间负责度是 O ( n 2 ) O(n^2) ,代码如下:
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;
    }

猜你喜欢

转载自blog.csdn.net/liangdong2014/article/details/86226622