LeedCode刷题(16、17、18、19、20)

目录

一、最接近三数之和

1、题目描述

2、题解

3、源码

二、电话号码的字母组合

1、题目描述

2、题解

3、源码

三、四数之和

1、题目描述

2、题解

3、源码

四、删除链表的倒数第N个结点

1、题目描述

2、题解

3、源码 

五、有效括号

1、题目描述

2、题解

3、源码


一、最接近三数之和

1、题目描述

2、题解

3、源码

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        best = 10**7
        n = len(nums)
        nums.sort()
        for i in range(n):
            if i > 0 and nums[i] == nums[i - 1]:
                continue
            L = i + 1
            R = n - 1
            while L < R:
                s = nums[i] + nums[L] + nums[R]
                if s == target:
                    return target
                if abs(s - target) < abs(best - target):
                    best = s
                if s > target:
                    R -= 1
                    while L < R and nums[R] == nums [R + 1]:
                        R -=1
                else:
                    L +=1
                    while L < R and nums[L] == nums[L - 1]:
                        L +=1
        return best




二、电话号码的字母组合

1、题目描述

2、题解

3、源码

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        if digits == '':
            return []
        phoneMap = {
            "2": "abc",
            "3": "def",
            "4": "ghi",
            "5": "jkl",
            "6": "mno",
            "7": "pqrs",
            "8": "tuv",
            "9": "wxyz",
        }
        res = ['']
        for num in digits:
            chars = phoneMap[num]
            new_res = []
            for r in res:
                for char in chars:
                    new_res.append(r+char)
            res = new_res
        return res

三、四数之和

1、题目描述

2、题解

3、源码


class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        quadruplets = list()
        if not nums or len(nums) < 4:
            return quadruplets
        
        nums.sort()
        length = len(nums)
        for i in range(length - 3):
            if i > 0 and nums[i] == nums[i - 1]:#排序之后的去重
                continue
            if nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target:#判断最小的和跟目标值的关系
                break
            if nums[i] + nums[length - 3] + nums[length - 2] + nums[length - 1] < target:
                continue#用最小的与最大的三数和,一次减少循环
            for j in range(i + 1, length - 2):#最右边为有指针的位置
                if j > i + 1 and nums[j] == nums[j - 1]:#去重
                    continue
                if nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target:
                    break#同样是最小的和与目标值比较
                if nums[i] + nums[j] + nums[length - 2] + nums[length - 1] < target:
                    continue
                left, right = j + 1, length - 1
                while left < right:
                    total = nums[i] + nums[j] + nums[left] + nums[right]
                    if total == target:
                        quadruplets.append([nums[i], nums[j], nums[left], nums[right]])
                        while left < right and nums[left] == nums[left + 1]:
                            left += 1
                        left += 1
                        while left < right and nums[right] == nums[right - 1]:
                            right -= 1
                        right -= 1
                    elif total < target:
                        left += 1
                    else:
                        right -= 1
        
        return quadruplets



四、删除链表的倒数第N个结点

1、题目描述

2、题解

3、源码 

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        def getLength(head: ListNode) -> int:
            length = 0
            while head:
                length += 1
                head = head.next
            return length
        
        dummy = ListNode(0, head)
        length = getLength(head)
        cur = dummy
        for i in range(1, length - n + 1):
            cur = cur.next
        cur.next = cur.next.next
        return dummy.next


五、有效括号

1、题目描述

2、题解

3、源码

class Solution {
public:
    bool isValid(string s) {
        stack<int> st;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '(') st.push(')');
            else if (s[i] == '{') st.push('}');
            else if (s[i] == '[') st.push(']');
            // 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false
            // 第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。所以return false
            else if (st.empty() || st.top() != s[i]) return false;
            else st.pop(); // st.top() 与 s[i]相等,栈弹出元素
        }
        // 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
        return st.empty();
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值