Leetcode 002-两数相加,004-寻找两个正序数组中位数,005-最长回文子串
002-两数相加
题目描述
- 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
- 请你将两个数相加,并以相同形式返回一个表示和的链表。
- 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
代码(python)
# 两数相加
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
def dfs(l, r, i):
if not l and not r and not i: return None
s = (l.val if l else 0) + (r.val if r else 0) + i
node = ListNode(s % 10)
node.next = dfs(l.next if l else None, r.next if r else None, s // 10)
return node
return dfs(l1, l2, 0)
- 时间复杂度:O(max(m,n))
- 空间复杂度:O(max(m,n))
004-寻找两个正序数组的中位数
题目描述
- 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
- 进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
代码(python)
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
# for i in range(len(nums2)):
# nums1.append(nums2[i])
# nums1.sort()
# if len(nums1) % 2 == 0:
# mild = len(nums1) // 2
# res = (nums1[mild - 1] + nums1[mild]) / 2
# else:
# mild = (len(nums1) - 1) // 2
# res = nums1[mild]
# return res
if len(nums1) > len(nums2):
nums1, nums2 = nums2, nums1
len1, len2 = len(nums1), len(nums2)
left, right, half_len = 0, len1, (len1 + len2 + 1) // 2
mid1 = (left + right) // 2
mid2 = half_len - mid1
while left < right:
if mid1 < len1 and nums2[mid2-1] > nums1[mid1]:
left = mid1 + 1
else:
right = mid1
mid1 = (left + right) // 2
mid2 = half_len - mid1
if mid1 == 0:
max_of_left = nums2[mid2-1]
elif mid2 == 0:
max_of_left = nums1[mid1-1]
else:
max_of_left = max(nums1[mid1-1], nums2[mid2-1])
if (len1 + len2) % 2 == 1:
return max_of_left
if mid1 == len1:
min_of_right = nums2[mid2]
elif mid2 == len2:
min_of_right = nums1[mid1]
else:
min_of_right = min(nums1[mid1], nums2[mid2])
return (max_of_left + min_of_right) / 2
- 时间复杂度:O(logmin(m,n)))
- 空间复杂度:O(1)
005-最长回文子串
题目描述
- 给你一个字符串 s,找到 s 中最长的回文子串。
代码(python)
class Solution:
def expandAroundCenter(self, s, left, right):
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
return left + 1, right - 1
def longestPalindrome(self, s: str) -> str:
start, end = 0, 0
for i in range(len(s)):
left1, right1 = self.expandAroundCenter(s, i, i)
left2, right2 = self.expandAroundCenter(s, i, i + 1)
if right1 - left1 > end - start:
start, end = left1, right1
if right2 - left2 > end - start:
start, end = left2, right2
return s[start: end + 1]
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)