第三周算法作业

这篇博客详细介绍了如何解决LeetCode中三道经典算法题:寻找最接近目标的三数之和、生成电话号码的字母组合以及删除链表的倒数第N个节点。博主通过排序、双指针和递归等方法,展示了高效解决问题的思路和代码实现。
摘要由CSDN通过智能技术生成

Leetcode No.16 No.17 No.19作业报告

No.16 最接近的三数之和

  • 思路
先对数组进行升序排序,然后每次选取一个数作为固定值
选择这个数后面的两个数使得他们三个之和尽可能贴近target
后面两个数的选取方式为左右逼近选取,当更加贴近target时就作为更优解更新
  • 代码
class Solution(object):
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        best_error = 1000000000000
        nums_sorted = nums.sort()
        nums_length = len(nums)
        for i in range(nums_length-2):
            # 希望 nums[left]与nums[right]之和尽可能接近target_sum
            target_sum = target - nums[i]
            # 下面对nums[i]后面处理最佳的值
            left = i+1
            right = nums_length-1
            while(left!=right):
                current_error = target_sum - (nums[left]+nums[right])
                if abs( current_error) <abs(best_error):
                    best_error = current_error
                if current_error<0:
                    right = right-1
                elif current_error>0:
                    left = left+1
                elif current_error ==0:
                    return target
        return target-best_error
  • 作业截图
    在这里插入图片描述

No.17 电话号码的字母组合

  • 思路
先把1去掉
然后针对digits长度为0和1的情况分别处理
最后嵌套两个循环依次将字母组合进行组合拼接得到最终值
  • 代码
class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        digits = digits.replace('1','')
        dict = {'2':'abc' , '3':'def', '4':'ghi', '5':'jkl', '6':'mno', \
            '7':'pqrs', '8':'tuv', '9':'wxyz' }
        str = []
        if len(digits)==0:
            return str
        
        for i in range(len(dict[digits[0]])):
            str.append(dict[digits[0]][i])

        # 每个返回的字符串的长度为len(digits)
        for i  in range(1,len(digits)):
            # i表示正在处理字符串的第i个位置。
            # 第i个位置可以添加的可能值有len(dict[digits[i]])个
            str_tmp = str
            str = []
             
            for j in range(len(str_tmp)):
                s = str_tmp[j]
                for k in range(len(dict[digits[i]])):
                    s_tmp = s + dict[digits[i]][k]
                    str.append(s_tmp)
        return str

  • 作业截图
    在这里插入图片描述

No.19 删除链表的倒数第 N 个结点

  • 思路
设置两个指针,一个指针指向的节点是另一个指针指向的节点的后n个
然后两个指针同时向后移动
当后一个指针抵达末尾时,前一个指针的下一个节点就是需要被删除的对象
需要注意的是,需要先处理删除头指针的特殊情况
  • 代码
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
        # 设置两个指针,一个指针指向的节点是另一个指针指向的节点的后n个
        # 当后一个指针抵达末尾时,前一个指针的下一个节点就是需要被删除的对象
        front = head
        
        for i in range(n):
            front = front.next
        
        # 删除头节点
        if front==None:
            return head.next

        cur = head
        while(front.next!=None):
            front = front.next
            cur = cur.next
        # front移动到了末尾
        cur.next = cur.next.next
        return head
  • 作业截图
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值