LeetCode 腾讯精选练习50--2, 4, 5

两数相加

题号:2
难度:中等
https://leetcode-cn.com/problems/add-two-numbers/
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

示例 1:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

【思路】
建立一个新的节点为初始节点,使用一个变量保存进位信息。
循环遍历给出的两个非空链表,若当前两个节点相加大于10,则进位+1,具体实现如下:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        re = ListNode(0)
        r = re
        carry = 0
        while l1 or l2:
            x = l1.val if l1 else 0
            y = l2.val if l2 else 0
            s = carry + x + y
            carry = s // 10
            r.next = ListNode(s % 10)
            r = r.next
            if l1 != None: l1 = l1.next
            if l2 != None: l2 = l2.next
        if carry > 0:
            r.next = ListNode(1)
        return re.next

两个正序数组的中位数

题号:4
难度:困难
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0

【思路】
将两个列表拼接起来,并重新排序,在返回中位数。

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        num = nums1 + nums2
        num.sort()
        n = len(num)
        return num[(n+1)//2 -1] if n & 1 else (num[n//2 -1] + num[n//2 ]) /2

最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。

【思路】
套娃问题,子串的子串回文,子串才有可能回文;
选定状态,s子串起始位置i,末尾位置j,需满足:

if s[i]==s[j]:
	if (j-1)-(i+1)<2: # 子串长度小于2 宣告回文
		dp[i][j]=True
	else:
		dp[i][j]=dp[i+1][j-1] # 子串回文 我回文

初始化条件:
需要建立一个二维的初始状态是False的来保存状态的数组来表示dp,又因为考虑只有一个字符的时候肯定是回文串,所以dp表格的对角线 dp[i][i] 肯定是True。

输出状态:

if dp[i][j]: #只要dp[i][j]成立就表示是回文子串,然后我们记录位置,返回有效答案 cur_len=j-i+1
	if cur_len>max_len: 
		max_len=cur_len
		start=i

具体实现:

class Solution:
    def longestPalindrome(self, s: str) -> str:
    	if len(s)<2: return s # 判断边界条件
        dp=[[False]*len(s) for _ in range(len(s))]  # 定义dp状态矩阵
        max_=1 # 记录回文子串长度
        start=0 # 记录子串起始位置
        for j in range(len(s)):
            for i in range(j):
                if s[i]==s[j]:
                    if j-i<3:
                        dp[i][j]=True
                    else:
                        dp[i][j]=dp[i+1][j-1]
                if dp[i][j]: # 记录最长回文子串长度以及起始位置
                    if j-i+1>max_:
                        max_=j-i+1
                        start=i
        return s[start:start+max_]

你可能感兴趣的:(Leetcode,leetcode,python,数据结构)