【Datawhale组队打卡】【Day1】第2、4、5题

第二题

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

思路

因为题目提供的就是两个ListNode头节点,直接按顺序加即可,进位也加进去

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        temp, t = 0, 0
        ans = ListNode()
        cur = ans  
        while l1 or l2 or t:   
            # 存在l1或者l2其中之一走完的情况,因此放一起考虑的话,要处理下
            temp = (l1.val if l1 else 0 ) + (l2.val if l2 else 0) + t    
            t = temp // 10
            temp = temp % 10  
            cur.next = ListNode()
            cur.next.val = temp
            cur = cur.next
            if l1:
                l1 = l1.next
            if l2:
                l2 = l2.next
        return ans.next

第四题

题目

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

思路

本来是准备直接按数组一步一步走到中位数取出就行,但是复杂度是o(m+n),不满足进阶的要求,所以想考虑要二分法。希望每次淘汰k//2的,但没想到怎么分。然后看了下别人的思路,最后就转成了找第K小的值。

#  nums1 和 nums2 两个数组,希望找第k小的,而且两数组本身有序,那么每次取nums1[k//2], nums2[k//2]比较就行
# 其中更小的值的左侧值都比我们要找的中位数小,删除即可。
class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        m,n = len(nums1),len(nums2)
        return (self.search(nums1,nums2,(m+n+1)//2)+self.search(nums1,nums2,(m+n+2)//2))/2

    def search(self, arr1, arr2, k):
        m,n = len(arr1), len(arr2)
        # 传进来的数组可能存在为空的情况,要处理边界
        if m == 0: return arr2[k-1]   
        if n == 0: return arr1[k-1]
        if k == 1: return min(arr1[0], arr2[0])
        i,j = min(k//2,m),min(k//2,n)
        if arr1[i-1] <= arr2[j-1]:   # 如果 arr1[i-1] <= arr2[j-1],则删除arr1对应左侧的元素·,并跟新k进行下一轮
            return self.search(arr1[i:],arr2,k-i)
        else:  # 同上
            return self.search(arr1,arr2[j:],k-j)

第三题

题目

给你一个字符串 s,找到 s 中最长的回文子串。

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

思路

第一反应是DP,可惜没想到怎么用DP,直接暴力枚举。
想法是就是按顺序取某个数,以该数为中心然后往两端扩展,相同就继续扩展,不同说明加进来后不是回文了。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        if len(s) < 2:
            return s
        L, max_len, res, i = len(s), 1, s[0], -1
        while i + 1 < 2 * L - max_len:
            i += 1
            if i % 2 and s[i // 2] != s[i // 2 + i % 2]:
                continue
            cur_len, left, right = 1 + i % 2, i // 2, i // 2 + i % 2
            while left - 1 >= 0 and right + 1 <= L - 1 and s[left - 1] == s[right + 1]:
                left -= 1
                right += 1
                cur_len += 2
            if cur_len > max_len:
                max_len, res = cur_len, s[left:right + 1]
        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值