python 算法 两数之和 的多种解法

两数之和问题是LeetCode上的一道经典算法题,也是面试中常见的问题。题目要求在一个整数数组中找到两个数,使它们的和等于一个特定的目标值,并返回这两个数的下标。

以下是多种解法:

  1. 暴力法: 最简单的方法是使用两个嵌套循环遍历数组中的所有可能组合,找到满足目标和的两个数。这种方法的时间复杂度为O(n^2)。
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 None
  1. 排序 + 双指针法: 先对数组进行排序,然后使用双指针从数组的两端开始向中间靠拢,根据和与目标值的大小关系来调整指针的位置。这种方法的时间复杂度为O(nlogn),其中n是数组的长度。
def twoSum(nums, target):
    sorted_nums = sorted(nums)
    left, right = 0, len(nums)-1
    while left < right:
        curr_sum = sorted_nums[left] + sorted_nums[right]
        if curr_sum == target:
            break
        elif curr_sum < target:
            left += 1
        else:
            right -= 1
    if left < right:
        # 在原数组中查找对应的下标
        index1 = nums.index(sorted_nums[left])
        index2 = nums.index(sorted_nums[right], index1+1)
        return [index1, index2]
    return None
  1. 使用集合(哈希表): 这种方法类似于使用字典的解法,但是不需要存储每个数字对应的下标,只需要存储数字本身。遍历数组时,判断目标值与当前数字的差值是否在集合中,如果在,则找到了满足条件的两个数。
def twoSum(nums, target):
    num_set = set()
    for num in nums:
        complement = target - num
        if complement in num_set:
            index1 = nums.index(complement)
            index2 = nums.index(num, index1+1)
            return [index1, index2]
        num_set.add(num)
    return None
  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用Python实现Dijkstra算法求解最短路径的示例代码: ```python import heapq def dijkstra(graph, start): # 初始化距离字典,将起点到起点的距离设为0,其余为无穷大 distances = {vertex: float('inf') for vertex in graph} distances[start] = 0 # 初始化堆和visited集合 heap = [(0, start)] visited = set() while heap: # 取出堆中距离最小的节点 (current_distance, current_vertex) = heapq.heappop(heap) # 如果该节点已经被访问过,则跳过 if current_vertex in visited: continue # 将该节点标记为已访问 visited.add(current_vertex) # 遍历该节点的所有邻居节点 for neighbor, weight in graph[current_vertex].items(): # 计算起点到该邻居节点的距离 distance = current_distance + weight # 如果该距离比已有的距离更小,则更新距离字典 if distance < distances[neighbor]: distances[neighbor] = distance # 将该邻居节点加入堆中 heapq.heappush(heap, (distance, neighbor)) # 返回距离字典 return distances ``` 其中,`graph`是一个字典,表示图的邻接表,`start`是起点。字典中的每个键表示一个节点,对应的值是一个字典,表示该节点的所有邻居节点及其边权重。 以下是一个示例图及其邻接表: ``` graph = { 'A': {'B': 1, 'C': 4}, 'B': {'A': 1, 'C': 2, 'D': 5}, 'C': {'A': 4, 'B': 2, 'D': 1}, 'D': {'B': 5, 'C': 1} } ``` 使用Dijkstra算法求解起点`A`到其它节点的最短路径: ```python distances = dijkstra(graph, 'A') print(distances) ``` 输出结果为: ``` {'A': 0, 'B': 1, 'C': 3, 'D': 4} ``` 表示起点`A`到各个节点的最短距离。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值