Leetcode 11-20

11. 盛最多水的容器 (思维)

思路很难 如果容器右侧比左侧低,那么移动左侧的木板,结果不会更好,所以应该移动右侧 反之亦然

    int maxArea(vector<int>& height) {
        int l=0,r=height.size()-1;
        int res=-1;
        while(l<r)
        {
            res=max(res,(r-l)*min(height[l],height[r]));
            if(height[l]>height[r])r--;
            else l++;
        }
        return res;

    }

12 整数转罗马数字 (模拟)

提高一次AC成功率 细心

    string intToRoman(int num) {
        string res;
        while(num>=1000)num-=1000,res+='M';
        if(num>=900)num-=900,res+="CM";
          if(num>=500)num-=500,res+="D";
       if(num>=400)num-=400,res+="CD";
        while(num>=100)num-=100,res+="C";
        if(num>=90)num-=90,res+="XC";
         if(num>=50)num-=50,res+="L";
         if(num>=40)num-=40,res+="XL";
          while(num>=10)num-=10,res+="X";
            if(num>=9)num-=9,res+="IX";
             if(num>=5)num-=5,res+="V";
         if(num>=4)num-=4,res+="IV";
         while(num>=1)num--,res+="I";
return res;
    }

13 上一道题意的reverse (模拟)

  int romanToInt(string s) {
        int n=s.size();
        int res=0;
        for(int i=n-1;i>=0;i--){
             if(s[i]=='I')res++;
            if(s[i]=='V'){
                res+=5;
                if(i&&s[i-1]=='I'){
                    i--;
                    res--;
                }
            }
             if(s[i]=='X'){
                res+=10;
                if(i&&s[i-1]=='I'){
                    i--;
                    res--;
                }
            }
             if(s[i]=='L'){
                res+=50;
                if(i&&s[i-1]=='X'){
                    i--;
                    res-=10;
                }
            }
             if(s[i]=='C'){
                res+=100;
                if(i&&s[i-1]=='X'){
                    i--;
                    res-=10;
                }
            }
             if(s[i]=='D'){
                res+=500;
                if(i&&s[i-1]=='C'){
                    i--;
                    res-=100;
                }
            }
             if(s[i]=='M'){
                res+=1000;
                if(i&&s[i-1]=='C'){
                    i--;
                    res-=100;
                }
            }
        }
return res;
    }

14. 最长公共前缀 (模拟)

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"

拿其它字符串跟第一个比就可以了
s.substr(i,l)表示从下标i开始 长度为l的字符串

 string longestCommonPrefix(vector<string>& strs) {
        string s=strs[0];
        for(int i=1;i<strs.size();i++)
        {
            for(int j=0;j<s.size();j++)
            {
                if(s[j]!=strs[i][j])s=s.substr(0,j);
            }
        }
        return s;
    }

15. 三数之和 (双指针)

vector<vector<int>> threeSum(vector<int>& nums) {
        vector <vector<int>>res;//二维数组 每行用三个空
        int n=nums.size();
        sort(nums.begin(),nums.end());
         for(int i=0;i<n;i++)
       {
           if(i&&nums[i]==nums[i-1])continue;//判重          先判断第一个条件 必须放前面
           for(int j=i+1,k=n-1;j<k;j++)//k放这里 O(n方)
           {
               if(j>i+1&&nums[j]==nums[j-1])continue;
               while(nums[i]+nums[j]+nums[k]>0&&k>j+1)k--;
               if(nums[i]+nums[j]+nums[k]==0)res.push_back({nums[i],nums[j],nums[k]});   
           }
       }
       return res;
    }

16

 int threeSumClosest(vector<int>& nums, int target) {
        int res=1e5,delta=1e5;
        int n=nums.size();
        sort(nums.begin(),nums.end());
        for(int i=0;i<n;i++)
        {
            for(int j=i+1,k=n-1;j<k;j++)
            {
                while(nums[i]+nums[j]+nums[k]>=target&&k>j+1)k--;//这里是等于 因为 停下来的右边
                //一定 大于等于 target 
               int sum=nums[i]+nums[j]+nums[k];

                if(abs(target-sum)<delta)
                {
                    delta=abs(target-sum);
                    res=sum;
                }
//大于等于target(下面的if) 和小于都比一下
                 if(k!=n-1&&abs(target-(sum-nums[k]+nums[k+1]))<delta)
                {
                    delta=abs(target-(sum-nums[k]+nums[k+1]));
                    res=sum-nums[k]+nums[k+1];
                }
            }
        }
        return res;
    }

18. 四数之和 (同15题)

 vector<vector<int>> fourSum(vector<int>& a, int target) {
       vector<vector<int> >b;
      sort(a.begin(),a.end());
      int n=a.size();
      for(int i=0;i<n;i++)
      {
          if(i&&a[i]==a[i-1])continue;//防止重复
          for(int j=i+1;j<n;j++)
          {
              if(j>i+1&&a[j]==a[j-1])continue;
              for(int k=j+1,u=n-1;k<u;k++) //n三方 
              {
                  if(k>j+1&&a[k]==a[k-1])continue;
                  while(u>k+1&&a[i]+a[j]>target-(a[k]+a[u]))u--;
                  if(a[i]+a[j]==target-(a[k]+a[u]))b.push_back({a[i],a[j],a[k],a[u]});

              }
          }
      }
       return b;
    }
posted @ 2021-10-11 20:45  liv_vil  阅读(28)  评论(0)    收藏  举报