📅  最后修改于: 2023-12-03 15:07:13.508000             🧑  作者: Mango
本套装旨在帮助初学者掌握算法的初步应用。套装中包含多个常见的算法问题,并提供对应的算法实现。
二分查找算法是一种常见的查找算法,其时间复杂度为 $O(\log n)$。该算法主要用于查找已经排好序的数组中的元素。
以下是二分查找算法的 Python 实现:
def binary_search(arr, target):
low, high = 0, len(arr) - 1
while low <= high:
mid = (low + high) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
low = mid + 1
else:
high = mid - 1
return -1
快速排序算法是一种常见的排序算法,其时间复杂度为 $O(n \log n)$。该算法主要通过将数组分成较小的子集,然后递归对子集进行排序,最终合并回原数组,以完成排序。
以下是快速排序算法的 Python 实现:
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
最大子序和问题是一个常见的动态规划问题,旨在查找一个数组的连续子序列,其中和的值最大。
以下是最大子序和问题的 Python 实现:
def max_sub_array(arr):
max_sum = curr_sum = arr[0]
for num in arr[1:]:
curr_sum = max(num, curr_sum + num)
max_sum = max(max_sum, curr_sum)
return max_sum
约瑟夫问题是一个经典的递归问题,在一个固定的集合中,从指定序号开始,每次从集合中删除一个元素,直到集合为空为止。求出集合中最后一次被删除的元素。
以下是约瑟夫问题的 Python 实现:
def josephus(n, k):
if n == 1:
return 1
return (josephus(n - 1, k) + k - 1) % n + 1
最长公共子序列问题是一个常见的动态规划问题,旨在查找两个字符串中最长的公共子序列。
以下是最长公共子序列问题的 Python 实现:
def lcs(X, Y):
m, n = len(X), len(Y)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m):
for j in range(n):
if X[i] == Y[j]:
dp[i + 1][j + 1] = dp[i][j] + 1
else:
dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j])
return dp[m][n]
本套装包含了多个常见的算法问题,并提供了对应的 Python 实现。初学者可以借助本套装快速掌握算法的初步应用。
注意:以上代码片段是按 markdown 标识的。