LeetCode 个人解答记录(11-15)
-
Container With Most Water
双指针,从两端开始,移动较短的那个边向中间靠拢,寻找过程中的最优解
Runtime: 16 ms, faster than 60.82% of C++ online submissions for Container With Most Water.
class Solution { public: int maxArea(vector<int>& height) { int j=height.size()-1; int i=0; int m=0; while(i<j){ m=max(m,(j-i)*min(height[i],height[j])); if(height[i]<height[j]){ i++; }else{ j--; } } return m; } };
-
Integer to Roman
类似于进制转换,比较简单
Runtime: 68 ms, faster than 32.62% of C++ online submissions for Integer to Roman.
class Solution { public: string intToRoman(int num) { map<int,string> a; a[1]="I"; a[10]="X"; a[100]="C"; a[4]="IV"; a[40]="XL"; a[400]="CD"; a[5]="V"; a[50]="L"; a[500]="D"; a[9]="IX"; a[90]="XC"; a[900]="CM"; string result=""; int n[5]={0}; int pointer=0; while(num){ n[pointer]=num%10; num=(num-n[pointer])/10; pointer++; } pointer--; if(pointer==3){ for(int i=0;i<n[pointer];i++){ result=result+"M"; } pointer--; } while(pointer>=0){ string one_c=a[1*pow(10,pointer)]; // cout<<one_c<<"!!!"<<endl; string five_c=a[5*pow(10,pointer)]; string nine_c=a[9*pow(10,pointer)]; string four_c=a[4*pow(10,pointer)]; int currentN=n[pointer]; int moreN=0; if(currentN>=5){ if(currentN==9){ result=result+nine_c; }else{ result=result+five_c; moreN=currentN-5; } }else{ if(currentN==4){ result=result+four_c; }else{ moreN=currentN; } } for(int i=0;i<moreN;i++){ result=result+one_c; } pointer--; } return result; } };
-
Roman to Integer
与上一题相反
Runtime: 76 ms, faster than 33.49% of C++ online submissions for Roman to Integer.
class Solution { public: int romanToInt(string s) { map<char,int> a; a['I']=1; a['V']=5; a['X']=10; a['L']=50; a['C']=100; a['D']=500; a['M']=1000; int n=s.length(); int result=0; for(int i=0;i<n;i++){ char c=s[i]; int currentN=a[c]; if(i<n-1){ char cn=s[i+1]; int nextN=a[cn]; if(currentN>=nextN){ result+=currentN; }else{ result-=currentN; } }else{ result+=currentN; } } return result; } };
-
Longest Common Prefix
不断与下一个字符串匹配当前最长公共前缀
Runtime: 4 ms, faster than 98.56% of C++ online submissions for Longest Common Prefix.
class Solution { public: string longestCommonPrefix(vector<string>& strs) { int n=strs.size(); if(n==0){ return ""; } string commonS=strs[0]; int len=commonS.length(); for(int i=0;i<n;i++){ string currentS=strs[i]; if(currentS.length()==0) return ""; for(int j=0;j<=min(commonS.length(),currentS.length());j++){ if(commonS[j]!=currentS[j]||j==min(commonS.length(),currentS.length())){ len=j; commonS=commonS.substr(0,len); break; } } } return commonS; } };
-
3Sum
双指针,两头缩减,查找与当前数字和为零的两个数
Runtime: 108 ms, faster than 54.16% of C++ online submissions for 3Sum.
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { sort(nums.begin(),nums.end()); vector<vector<int>> result; int n=nums.size(); for(int i=0;i<n;i++){ if(nums[i]>0){ break; } if(i>0&&nums[i-1]==nums[i]){ continue; } int l=i+1; int r=n-1; while(l<r){ int sum=nums[i]+nums[l]+nums[r]; if(sum<0){ l++; }else if(sum>0){ r--; }else{ result.push_back(vector<int>{nums[i],nums[l],nums[r]}); while(l+1<r&&nums[l]==nums[l+1]) l++; while(r-1>l&&nums[r]==nums[r-1]) r--; l++; r--; } } } return result; } };