leetcode 两数相加/最长回文子串/字符串转换整数(atoi)/盛最多水的容器/三数之和/最接近的三数之和

两数相加

题目链接:https://leetcode-cn.com/problems/add-two-numbers/

leetcode 两数相加/最长回文子串/字符串转换整数(atoi)/盛最多水的容器/三数之和/最接近的三数之和_第1张图片

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int num=(l1->val+l2->val)%10;
        int div=(l1->val+l2->val)/10;
        ListNode *head=new ListNode(num);
        ListNode *l3=head;
        l1=l1->next;
        l2=l2->next;
        
        while(l1&&l2)
        {
            num=(div+l1->val+l2->val)%10;
            div=(div+l1->val+l2->val)/10;
            l3->next=new ListNode(num);
            l3=l3->next;
            l1=l1->next;
            l2=l2->next;
        }
        
        //如果l1还没有遍历完
        while(l1)
        {
            num=(div+l1->val)%10;
            div=(div+l1->val)/10;
            l3->next=new ListNode(num);
            l3=l3->next;
            l1=l1->next;
        }
        
        //如果l2还没有遍历完
        while(l2)
        {
            num=(div+l2->val)%10;
            div=(div+l2->val)/10;
            l3->next=new ListNode(num);
            l3=l3->next; 
            l2=l2->next;
        }
        
        if(div!=0)
        {
            l3->next=new ListNode(div);
            l3=l3->next;
        }
        return head;
    }
};

有点像merge2个有序链表的操作,注意进位即可

最长回文子串

题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/

leetcode 两数相加/最长回文子串/字符串转换整数(atoi)/盛最多水的容器/三数之和/最接近的三数之和_第2张图片

博客指路

字符串转换整数(atoi)

题目链接:https://leetcode-cn.com/problems/string-to-integer-atoi/

leetcode 两数相加/最长回文子串/字符串转换整数(atoi)/盛最多水的容器/三数之和/最接近的三数之和_第3张图片

leetcode 两数相加/最长回文子串/字符串转换整数(atoi)/盛最多水的容器/三数之和/最接近的三数之和_第4张图片

class Solution {
public:
    int deal_with_cal(string &str,int index)
    {
        //首先判断,刚开始的加减符号是不是最后一个字符或者加减符号后是否不是数字
        //如果满足任意一种情况都直接返回0
        if(index+1>=str.size()||(str[index+1]<'0'||str[index+1]>'9'))
            return 0;
        
        //记录标点符号
        bool minus=false;
        if(str[index]=='-')
            minus=true;
        
        long long num=0;
        
        for(int i=index+1;i='0'&&str[i]<='9')
            {
                num=num*10+(str[i]-'0');
                //如果超出负数范围
                if(minus&&(num-1>INT_MAX))
                    return INT_MIN;
                else if(!minus&&(num>INT_MAX))
                    return INT_MAX;
            }
            else 
                break;
        }
        
        if(minus)
            return num*(-1);
        else
            return num;        
    }
    
    int deal_with_num(string &str,int index)
    {
        long long num=0;
        for(int i=index;i='0'&&str[i]<='9')
            {
                num=num*10+(str[i]-'0');
                //如果超出范围
                if(num>INT_MAX)
                    return INT_MAX;
            }
            else 
                break;
        }        
        return num;         
    }
    
    
    int myAtoi(string str) {
        if(str.size()==0)
            return 0;
        
        for(int i=0;i='0'&&str[i]<='9')
            {
                return deal_with_num(str,i);
            }
            
            //不是加减或数字
            else
            {
                return 0;
            }
        }
        return 0;
        
    }
};

注意有一句代码:num-1>INT_MAX这句并不可以写成num>1+INT_MAX,因为1+INT_MAX会变为INT_MIN

盛最多水的容器

题目链接:https://leetcode-cn.com/problems/container-with-most-water/

leetcode 两数相加/最长回文子串/字符串转换整数(atoi)/盛最多水的容器/三数之和/最接近的三数之和_第5张图片

class Solution {
public:
    int maxArea(vector& height) {
        if(height.size()==2)
            return height[0]>height[1]?height[1]:height[0];
        int maxw=0;
        int i=0,j=height.size()-1;
        while(iheight[i]?height[i]:height[j]);
            if(temw>maxw)
                maxw=temw;
            if(height[j]>height[i])
                i++;
            else
                j--;
        }
        return maxw;
    }
};

从2头往中间挤,当间距在缩小时,要想获得最大容量必须使最低木板变高,才有可能得到最大值。

三数之和

题目链接:https://leetcode-cn.com/problems/3sum/

leetcode 两数相加/最长回文子串/字符串转换整数(atoi)/盛最多水的容器/三数之和/最接近的三数之和_第6张图片

class Solution {
public:
    vector> threeSum(vector& nums) {
        vector> vt;
        if(nums.size()<3)
            return vt;
        
        sort(nums.begin(),nums.end());
        map mp;
        
        for(int i=0;i0)
                return vt;
            //如果之前处理过这个数,不再处理
            if(mp[nums[i]])
                continue;
            mp[nums[i]]++;
            
            int lptr=i+1;
            int rptr=nums.size()-1;
            
            while(lptr {nums[i],nums[lptr],nums[rptr]});
                    do
                    {
                        lptr++;
                    }while(nums[lptr-1]==nums[lptr]&&lptr0)
                {
                    do
                    {
                        rptr--;
                    }while(nums[rptr+1]==nums[rptr]&&lptr

先排序,然后从左到右依次固定住一个数作为第一个数,之后选另外2个数(用左右夹击的方法),如果该数满足要注意之后的去重。

最接近的三数之和

题目链接:https://leetcode-cn.com/problems/3sum-closest/

leetcode 两数相加/最长回文子串/字符串转换整数(atoi)/盛最多水的容器/三数之和/最接近的三数之和_第7张图片

class Solution {
public:
    int threeSumClosest(vector& nums, int target) {
        if(nums.size()==3)
            return nums[0]+nums[1]+nums[2];
        sort(nums.begin(),nums.end());
        
        //为正
        if(target&&nums[nums.size()-1]<=0)
            return nums[nums.size()-1]+nums[nums.size()-2]+nums[nums.size()-3];
        
        if(!target&&nums[0]>=0)
            return nums[0]+nums[1]+nums[2];
        
        int res;
        int abs_minus_min=INT_MAX;
        int j=nums.size()-1;
        
        for(int i=0;i0)
                    rptr--;
                else if(temp_minus<0)
                    lptr++;
                else
                    return res;
            }
        } 
        return res;
    }
};

差不多的套路,只是不用去重而已,因为最后答案只有一个。

 

 

你可能感兴趣的:(leetcode)