> 簡潔易懂講清原理,講不清你來打我~
輸入整數,輸出對應的羅馬字串





簡單的思路
準備好整數對應羅馬的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. 四數之和


詳細的思路
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;
```
> 喜歡簡潔易懂還能講清楚原理部落格的小夥伴就關注關注這個非常高產的博主呀,下次再會~