leetcode的十道题目和参考答案
leetcode的十道题目和参考答案
- 两数之和(哈希表优化)
题目:给定整数数组 nums 和目标值 target,返回数组中两个数的索引,使它们的和等于目标值。
输入样例:
nums = [2,7,11,15], target = 9
输出样例:
[0,1]
代码与解析:
def twoSum(nums, target):
hashmap = {}
for i, num in enumerate(nums):
complement = target - num
if complement in hashmap:
return [hashmap[complement], i]
hashmap[num] = i
return []
print(twoSum([2,7,11,15], 9))
解析:
遍历数组时用哈希表记录每个数字的索引。
检查当前数的补数(target - num)是否在哈希表中,找到即返回。
时间复杂度 O(n),空间复杂度 O(n)。
2. 最长无重复字符子串(滑动窗口)
题目:给定字符串 s,找到不含重复字符的最长子串长度。
输入样例:
s = “abcabcbb”
输出样例:
3
代码与解析:
def lengthOfLongestSubstring(s):
left = max_len = 0
char_map = {}
for right in range(len(s)):
if s[right] in char_map and char_map[s[right]] >= left:
left = char_map[s[right]] + 1
char_map[s[right]] = right
max_len = max(max_len, right - left + 1)
return max_len
print(lengthOfLongestSubstring(“abcabcbb”))
解析:
滑动窗口 [left, right] 维护当前无重复区间。
用字典记录字符最后出现的位置,若重复则移动左指针。
时间复杂度 O(n),空间复杂度 O(字符集大小)。
3. 合并两个有序链表(迭代法)
题目:将两个升序链表合并为一个新的升序链表。
输入样例:
list1 = [1,2,4], list2 = [1,3,4]
输出样例:
[1,1,2,3,4,4]
代码与解析:
python
Copy Code
class ListNode:
def init(self, val=0, next=None):
self.val = val
self.next = next
def mergeTwoLists(l1, l2):
dummy = ListNode()
curr = dummy
while l1 and l2:
if l1.val <= l2.val:
curr.next = l1
l1 = l1.next
else:
curr.next = l2
l2 = l2.next
curr = curr.next
curr.next = l1 if l1 else l2
return dummy.next
测试代码需要构造链表,此处省略构造过程
解析:
使用哑节点简化头节点处理。
比较两链表当前节点,依次连接较小值。
时间复杂度 O(m+n),空间复杂度 O(1)。
4. 有效的括号(栈应用)
题目:判断只包含 (){}[] 的字符串是否有效。
输入样例:
s = “()[]{}”
输出样例:
True
代码与解析:
def isValid(s):
stack = []
mapping = {‘)’:‘(’, ‘]’:‘[’, ‘}’:‘{’}
for char in s:
if char in mapping:
top = stack.pop() if stack else ‘#’
if top != mapping[char]:
return False
else:
stack.append(char)
return not stack
print(isValid(“()[]{}”))
解析:
遇到左括号入栈,右括号则检查栈顶是否匹配。
栈为空或栈顶不匹配直接返回 False。
时间复杂度 O(n),空间复杂度 O(n)。
5. 爬楼梯(动态规划)
题目:每次可爬1或2阶台阶,求爬到n阶的方法总数。
输入样例:
n = 3
输出样例:
3
代码与解析:
def climbStairs(n):
if n <= 2: return n
a, b = 1, 2
for _ in range(3, n+1):
a, b = b, a + b
return b
print(climbStairs(3))
解析:
状态转移方程:dp[i] = dp[i-1] + dp[i-2]。
用滚动变量优化空间复杂度至 O(1)。
时间复杂度 O(n)。
6. 二叉树的中序遍历(迭代法)
题目:给定二叉树根节点,返回中序遍历结果。
输入样例:
root = [1,null,2,3]
输出样例:
[1,3,2]
代码与解析:
class TreeNode:
def init(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def inorderTraversal(root):
res = []
stack = []
curr = root
while curr or stack:
while curr:
stack.append(curr)
curr = curr.left
curr = stack.pop()
res.append(curr.val)
curr = curr.right
return res
测试代码构造树:root = TreeNode(1, None, TreeNode(2, TreeNode(3)))
解析:
用栈模拟递归过程,先压左子树到尽头,再处理根节点,最后转向右子树。
时间复杂度 O(n),空间复杂度 O(n)。
7. 最大子序和(动态规划)
题目:求整数数组中和最大的连续子数组的和。
输入样例:
nums = [-2,1,-3,4,-1,2,1,-5,4]
输出样例:
6
代码与解析:
def maxSubArray(nums):
max_sum = curr_sum = nums[0]
for num in nums[1:]:
curr_sum = max(num, curr_sum + num)
max_sum = max(max_sum, curr_sum)
return max_sum
print(maxSubArray([-2,1,-3,4,-1,2,1,-5,4]))
解析:
定义 curr_sum 表示以当前元素结尾的最大子序和。
若当前元素单独成子数组更大,则重置 curr_sum。
时间复杂度 O(n),空间复杂度 O(1)。
8. 反转链表(迭代法)
题目:反转单链表,返回新链表的头节点。
输入样例:
head = [1,2,3,4,5]
输出样例:
[5,4,3,2,1]
代码与解析:
def reverseList(head):
prev = None
curr = head
while curr:
next_temp = curr.next
curr.next = prev
prev = curr
curr = next_temp
return prev
测试代码构造链表:1->2->3->4->5
解析:
用三个指针 prev, curr, next_temp 逐个反转节点指向。
时间复杂度 O(n),空间复杂度 O(1)。
9. 盛最多水的容器(双指针)
题目:给定非负整数数组表示容器高度,求两线段与x轴组成的容器能容纳的最大水量。
输入样例:
height = [1,8,6,2,5,4,8,3,7]
输出样例:
49
代码与解析:
def maxArea(height):
left, right = 0, len(height)-1
max_area = 0
while left < right:
area = (right - left) * min(height[left], height[right])
max_area = max(max_area, area)
if height[left] < height[right]:
left += 1
else:
right -= 1
return max_area
print(maxArea([1,8,6,2,5,4,8,3,7]))
解析:
双指针从两端向中间移动,每次移动较矮的一侧以寻找更大面积。
时间复杂度 O(n),空间复杂度 O(1)。
10. 三数之和(排序+双指针)
题目:找出数组中所有和为0的三元组,且不重复。
输入样例:
nums = [-1,0,1,2,-1,-4]
输出样例:
[[-1,-1,2], [-1,0,1]]
代码与解析:
def threeSum(nums):
nums.sort()
res = []
for i in range(len(nums)-2):
if i > 0 and nums[i] == nums[i-1]:
continue
left, right = i+1, len(nums)-1
while left < right:
s = nums[i] + nums[left] + nums[right]
if s < 0:
left += 1
elif s > 0:
right -= 1
else:
res.append([nums[i], nums[left], nums[right]])
while left < right and nums[left] == nums[left+1]:
left += 1
while left < right and nums[right] == nums[right-1]:
right -= 1
left += 1
right -= 1
return res
print(threeSum([-1,0,1,2,-1,-4]))
解析:
先排序,固定第一个数后用双指针找后两数。
跳过重复元素避免结果重复。
时间复杂度 O(n²),空间复杂度 O(1)(不计结果存储)。
所有代码均通过LeetCode测试用例,直接复制即可运行。
更多推荐




所有评论(0)