LeetCode上的问题可以有很多不同的解题思路,具体的解法取决于问题的要求和限制条件。以下是一些常见的解题思路和Python代码示例:
文章目录
思路
1. 暴力法(Brute Force):
- 思路:通过穷举所有可能的解决方案,找到满足条件的解。
- 示例:
def twoSum(nums, target):
n = len(nums)
for i in range(n):
for j in range(i+1, n):
if nums[i] + nums[j] == target:
return [i, j]
return []
2. 哈希表(Hash Table):
- 思路:利用哈希表存储元素和其索引的对应关系,通过查询哈希表中是否存在目标元素来解决问题。
- 示例:
def twoSum(nums, target):
hash_table = {}
for i, num in enumerate(nums):
complement = target - num
if complement in hash_table:
return [hash_table[complement], i]
hash_table[num] = i
return []
3. 双指针(Two Pointers):
- 思路:使用两个指针从不同的方向遍历数组,根据问题的要求移动指针,找到满足条件的解。
- 示例:
def twoSum(numbers, target):
left, right = 0, len(numbers) - 1
while left < right:
sum = numbers[left] + numbers[right]
if sum == target:
return [left + 1, right + 1]
elif sum < target:
left += 1
else:
right -= 1
return []
4. 动态规划(Dynamic Programming):
- 思路:将问题分解为子问题,并通过存储子问题的解来避免重复计算,从而得到最优解。
- 示例:
def maxSubArray(nums):
n = len(nums)
dp = [0] * n
dp[0] = nums[0]
max_sum = dp[0]
for i in range(1, n):
dp[i] = max(nums[i], dp[i-1] + nums[i])
max_sum = max(max_sum, dp[i])
return max_sum
这只是一些解题思路的例子,实际上,每个问题都有其独特的特点和解决方法。在解决LeetCode问题时,建议先仔细阅读问题描述,理解问题的要求和限制条件,然后根据问题的特点选择合适的解题思路。
例题
1. 两数之和(Two Sum):
- 题目描述:给定一个整数数组nums和一个目标值target,在数组中找出和为目标值的两个整数,并返回它们的索引。
- 示例代码:
def twoSum(nums, target):
hash_table = {}
for i, num in enumerate(nums):
complement = target - num
if complement in hash_table:
return [hash_table[complement], i]
hash_table[num] = i
return []
2. 盛最多水的容器(Container With Most Water):
- 题目描述:给定n个非负整数a1,a2,…,an,其中每个数表示坐标(i,ai)处的一个点。在坐标系中画n条垂直线,垂直线i的两个端点分别为(i,ai)和(i,0)。找出两条线,它们与x轴共同构成的容器可以容纳最多的水。
- 示例代码:
def maxArea(height):
left, right = 0, len(height) - 1
max_area = 0
while left < right:
area = min(height[left], height[right]) * (right - left)
max_area = max(max_area, area)
if height[left] < height[right]:
left += 1
else:
right -= 1
return max_area
3. 无重复字符的最长子串(Longest Substring Without Repeating Characters):
- 题目描述:给定一个字符串,请找出其中不含有重复字符的最长子串的长度。
- 示例代码:
def lengthOfLongestSubstring(s):
max_length = 0
start = 0
char_map = {}
for i in range(len(s)):
if s[i] in char_map and start <= char_map[s[i]]:
start = char_map[s[i]] + 1
else:
max_length = max(max_length, i - start + 1)
char_map[s[i]] = i
return max_length
4. 两两交换链表中的节点(Swap Nodes in Pairs):
- 题目描述:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
- 示例代码:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def swapPairs(head):
if not head or not head.next:
return head
dummy = ListNode(0)
dummy.next = head
prev = dummy
while head and head.next:
first_node = head
second_node = head.next
prev.next = second_node
first_node.next = second_node.next
second_node.next = first_node
prev = first_node
head = first_node.next
return dummy.next