leetcode腾讯50-16-20-21

题解:3sum问题变型,同样采取排序+双指针,但不需要再考虑重复问题。

此题目标为使target和三数值之和的差值绝对值最小 ,循环过程中标记最小差值。

在此过程中,考虑到target可能为负值,双指针移动的方向有两种情况:当差值为负值时,表示target比三数值之和小,移动方向要求在第一个数固定时,二三位数之和要往小的方向移动,故右指针左移;同理,差值为正值,左指针右移;差值为0,直接返回target。

class Solution {

public:

    int threeSumClosest(vector& nums, int target) {

        sort(nums.begin(),nums.end());

        int mindif=10000;

        int n=nums.size();

        for(int i=0;i

        {

            int j=i+1;

            int k=n-1;

            int dir=target-nums[i];

            while(ji&&k

            {

                int d=dir-nums[j]-nums[k];

                if(abs(d)

                if(d<0){

                    k--;

                }else if(d>0){

                    j++;

                }else{

                    return target;

                }

            }

        }

        return  target-mindif;

    }

};


分析:根据字典key-value特性,选择将括号存储进unordered_map中,

//只要遇到的不是右括号,就将s中的元素push进stack,是的话,就弹出一个,判断是否对应,不对应则返回false,对应则继续。

class Solution {

public:

    bool isValid(string s) {

        if(s=="")return true;

        std::stackst;

        unordered_mapmmap;

        mmap['}']='{';

        mmap[']']='[';

        mmap[')']='(';

        for(char i:s)

        {

            if(i!=')'&&i!=']'&&i!='}')

            st.push(i);

            else{

             if(st.empty()||st.top()!=mmap[i])return false;

            st.pop();

            }

        }

        if(!st.empty()) return false;

        return true;

    }


21. 合并两个有序链表

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     ListNode *next;

 *     ListNode() : val(0), next(nullptr) {}

 *     ListNode(int x) : val(x), next(nullptr) {}

 *     ListNode(int x, ListNode *next) : val(x), next(next) {}

 * };

 */

class Solution {

public:

    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {

        if(l1==nullptr||l2==nullptr)

        return (l1==nullptr)?l2:l1;

        ListNode*p=(l1->val<=l2->val)?l1:l2;

        if(p==l1)l1=l1->next;

        else l2=l2->next;

        ListNode*head=p;

        while(l1!=nullptr&&l2!=nullptr)

        {

            if(l1->val<=l2->val)

            {

                p->next=l1;

                l1=l1->next;

            }else{

                p->next=l2;

                l2=l2->next;

            }

            p=p->next;

        }

        if(l1!=nullptr){

            p->next=l1;

        }

        if(l2!=nullptr)

        {

            p->next=l2;

        }

        return head;

    }

};


你可能感兴趣的:(leetcode腾讯50-16-20-21)