leetcode—4/22

1.整数转罗马数字

罗马数字包含以下七种字符:I, V, X, L, C, D和M

字符数值
I1
V5
X10
L50
C100
D500
M1000
通常情况下,罗马数字中小的数字在大的数字的右边。 特例: + I可以放在V和X的左边,表示4和9 + X可以放在L和C的左边,表示40和90 + C可以放在D和M的左边,表示400和900 给定一个整数,将其转为罗马数字

思路:先把数字反转,然后处理反转的数字

string intToRoman(int num) {
        vector<int> v = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        vector<string> c = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
        string res = "";
        
        for(int i = 0; i < v.size(); i++)
        {
            int times = num / v[i];
            for(int j = 0; j < times; j++)
            {
                res += c[i];
            }
            num = num % v[i];
        }
        return res;
    }

2.三数之和

给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a+b+c=0?找到所有满足条件且不重复的三元组。

思路:将数组排序,从开头元素开始遍历,将三数之和转化为两数之和问题。利用双指针,注意超时问题。

vector<vector<int>> threeSum(vector<int>& nums) {
        set< vector<int> > s;
        vector< vector<int> > res;
        sort(nums.begin(), nums.end());
        
        for(int i = 0; i < nums.size(); i++)
        {
            if(nums[i] > 0)
            {
                break;
            }
            if(i > 0 && nums[i] == nums[i - 1])
            {
                continue;
            }
            
            int target = -nums[i];
            int j = i + 1;
            int k = nums.size() - 1;
            
            while(j < k)
            {
                if(nums[j] + nums[k] == target)
                {
                    vector<int> temp;
                    temp.push_back(nums[i]);
                    temp.push_back(nums[j]);
                    temp.push_back(nums[k]);
                    s.insert(temp);
                    while(j < k && nums[j] == nums[j + 1])
                    {
                        j++;
                    }
                    while(j < k && nums[k] == nums[k - 1])
                    {
                        k--;
                    }
                    j++;
                    k--;
                }
                else if(nums[j] + nums[k] < target)
                {
                    j++;
                }
                else if(nums[j] + nums[k] > target)
                {
                    k--;
                }
            }
        }
        
        for(set< vector<int> >::iterator it = s.begin(); it != s.end(); it++)
        {
            res.push_back(*it);
        }
        return res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值