LeetCode 个人解答记录(11-15)

LeetCode 个人解答记录(11-15)

  1. 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;
      	 
      	 }
       };	
    
  2. 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;
            
        }
    };
    
  3. 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;
        }
    };
    
  4. 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;
      	     
      	 }
       };
    
  5. 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;
        }
    };
    

猜你喜欢

转载自blog.csdn.net/Hi_maxin/article/details/85275451