> 简洁易懂讲清原理,讲不清你来打我~


输入整数,输出对应的罗马字符串
![在这里插入图片描述](https://img-blog.csdnimg.cn/54b001c62a0d4d348c962ce7c304594f.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/7b7451281e2040048fd8254325862cb9.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/462fc7c349614751a2a972b47afe7036.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/d752db71ef6445b6b8b4979f41f36496.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/a1346688d449461d914001704cc81b39.png)
简单的思路
准备好整数对应罗马的pair数组从大到小,对于输入的数字,先找最大的罗马数字也就是第一个小于输入数字的罗马数字作为最高位,输入的数字剩余量再找最大的罗马数字

精确的定义
numToRoman是[数字,罗马字符串]的的数组
arrNum是罗马数字的值
arrRoman是罗马数字
ans是数字对应的最终罗马字符串

```cpp
class Solution {
public:
string intToRoman(int num) {
pair<int,string>numToRoman[]={
{1000, "M"},
{900, "CM"},
{500, "D"},
{400, "CD"},
{100, "C"},
{90, "XC"},
{50, "L"},
{40, "XL"},
{10, "X"},
{9, "IX"},
{5, "V"},
{4, "IV"},
{1, "I"},
};
string ans;
while(num>0){
for(auto &[arrNum,arrRoman]:numToRoman){
if(num>=arrNum){
num-=arrNum;
ans+=arrRoman;
break;
}
}
}
return ans;
}
};
```

Leetcode18. 四数之和
![在这里插入图片描述](https://img-blog.csdnimg.cn/01eed92352d24ed39f1400c5d0c53d93.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/09722a6f4872406aa20bfdcedee28734.png)
详细的思路
sort,长度小于4直接返回,对于第一个元素,向右找第二个元素,leftright两侧往中间找第三第四个元素,相等continue去重,小了left++,大了right--

精确的定义
i第一个元素
j第二个元素
left第三个元素
right第四个元素
ans所有满足的四元组

```cpp
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
if(nums.size()<4)return{};
vector<vector<int>>ans;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size()-3;i++){
if(i-1>=0&&nums[i]==nums[i-1])continue;
if((long long)nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>(long long)target)break;
if(nums[i]+nums[nums.size()-3]+nums[nums.size()-2]+nums[nums.size()-1]<target)continue;
for(int j=i+1;j<nums.size()-2;j++){
if(j-1>=i+1&&nums[j]==nums[j-1])continue;
int left=j+1,right=nums.size()-1;
while(left<right){
if(left-1>j+1&&nums[left]==nums[left-1]){
left++;
continue;
}
if(right+1<=nums.size()-1&&nums[right]==nums[right+1]){
right--;
continue;
}
if(nums[i]+nums[j]+nums[left]+nums[right]==target){
ans.push_back({nums[i],nums[j],nums[left],nums[right]});
left++,right--;
}
else if(nums[i]+nums[j]+nums[left]+nums[right]<target){
left++;
}else if(nums[i]+nums[j]+nums[left]+nums[right]>target){
right--;
}
}
}
}
return ans;
}
};
```

踩过的坑

```cpp
if((long long)nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>(long long)target)break;
```

 

> 喜欢简洁易懂还能讲清楚原理博客的小伙伴就关注关注这个非常高产的博主呀,下次再会~

posted on 2021-07-24 00:05  offer快到碗里来~  阅读(38)  评论(0)    收藏  举报