其他分享
首页 > 其他分享> > task04,leetcode:16,20,21

task04,leetcode:16,20,21

作者:互联网

16.最接近的三数之和

与三数之和非常相似的题目,均为双指针。
代码中给出了部分剪枝操作,可以稍作了解,思考一下剪掉的是什么。

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        nums.sort()									# 排序的意义是方便后面双指针可以使用
        n = len(nums)
        best = float('inf')                         # 记录与target差最小的和
        for left in range(n):
            # 下面的if判断是剪枝的作用,提前中断重复条件,没有也阔以
            if left > 0 and nums[left] == nums[left - 1]:
                continue

            mid, right = left + 1, n - 1
            while mid < right:
                cur_sum = nums[left] + nums[mid] + nums[right]

                # 三者和与target相等时直接返回就可以,因为差值为0
                if cur_sum == target:               
                    return target

                # 当与target差值更小时更新best
                if abs(cur_sum - target) < abs(best - target):
                    best = cur_sum

                # 三者和比target大时,需要缩小,所以右指针左移
                if cur_sum > target:
                    right -= 1

                    # 下面四行与上面等价,只不过做了剪枝操作。提前退出相邻元素相等的情况
                    # temp = right - 1
                    # while temp > mid and nums[temp] == nums[right]:
                    #     temp -= 1
                    # right = temp
                else:
                    # 同为剪枝操作,改为left += 1是一样的效果
                    temp = mid + 1
                    while temp < right and nums[temp] == nums[mid]:
                        temp += 1
                    mid = temp
        return best

20.有效的括号

栈stack(先进后出的数据结构)的经典入门题目,与此类似的是队列(deque)(先进先出的数据结构)

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []                          # 使用栈来记录当前的遍历情况
        match = {')':'(', ']':'[', '}':'{'} # 用来记录左右括号的配对关系
        for ch in s:
            if ch in '([{':                 # 如果是左括号,则入栈
                stack.append(ch)
            else:                           # 右括号时
                if stack and stack[-1] == match[ch]: # 如果栈非空且匹配,则弹出
                    stack.pop()
                else:                       # 栈空或者不匹配,直接返回False
                    return False
        # 结束后栈空则表示完全匹配,不空则表示有多余的左括号
        return len(stack) == 0              

时间复杂度O(n),空间复杂度O(n)。

21.合并两个有序链表

与2.两数相加比较类似,参照那题吧

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        #### 这题就不详细写了吧,参照2.两数相加
        dummyhead = temp = ListNode(0)         
        while l1 and l2:
            val1, val2 = l1.val, l2.val
            if val1 < val2:
                temp.next = l1
                l1 = l1.next
            else:
                temp.next = l2
                l2 = l2.next
            temp = temp.next
        while l1:
            temp.next = l1
            temp, l1 = temp.next, l1.next
        while l2:
            temp.next = l2
            temp, l2 = temp.next, l2.next
        return dummyhead.next

时间复杂度O(m+n),空间复杂度O(1)。

标签:20,target,temp,nums,16,next,l2,l1,task04
来源: https://blog.csdn.net/juanjuanyou/article/details/112549485