力扣常见算法题

LeetCode上的问题可以有很多不同的解题思路,具体的解法取决于问题的要求和限制条件。以下是一些常见的解题思路和Python代码示例:

文章目录

  • 思路
    • 1. 暴力法(Brute Force):
    • 2. 哈希表(Hash Table):
    • 3. 双指针(Two Pointers):
    • 4. 动态规划(Dynamic Programming):
  • 例题
    • 1. 两数之和(Two Sum):
    • 2. 盛最多水的容器(Container With Most Water):
    • 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters):
    • 4. 两两交换链表中的节点(Swap Nodes in Pairs):

思路

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

力扣常见算法题_第1张图片

你可能感兴趣的:(leetcode,算法)