返回

用Rust实现两数之和

前端

最近学习了Rust的基础知识,想要找一些算法问题来练习,解决LeetCode上的算法问题是一个不错的选择。但是,用Rust来实现这些算法会遇到一些麻烦。由于没有注意到一些细节,导致了各种各样的编译错误。

我们先来看一下LeetCode上的“两数之和”问题:

给定一个整数数组nums和一个目标值target,请在数组中找到两个数字,使得它们的和等于target。
可以假设每个输入只有一个解决方案,且您无法使用相同元素两次。

这是一个经典的算法问题,可以用多种方式来解决。使用Rust实现“两数之和”算法的一种方法是使用哈希表。哈希表是一种数据结构,它允许您在O(1)的时间内查找和插入元素。

首先,创建一个哈希表,并将每个数字作为键,其索引作为值插入到哈希表中。然后,遍历数组的每个元素,对于每个元素,计算target减去该元素的值。如果计算结果在哈希表中,那么就找到了两个数字,它们的和等于target。

use std::collections::HashMap;

fn two_sum(nums: &[i32], target: i32) -> Option<(i32, i32)> {
    let mut map = HashMap::new();
    for (i, num) in nums.iter().enumerate() {
        let complement = target - num;
        if map.contains_key(&complement) {
            return Some((*map.get(&complement).unwrap(), i as i32));
        }
        map.insert(*num, i as i32);
    }
    None
}

fn main() {
    let nums = vec![2, 7, 11, 15];
    let target = 9;
    match two_sum(&nums, target) {
        Some((i, j)) => println!("Found two numbers: {} and {}", i, j),
        None => println!("No two numbers found")
    }
}

这段代码首先创建一个哈希表,并将每个数字作为键,其索引作为值插入到哈希表中。然后,遍历数组的每个元素,对于每个元素,计算target减去该元素的值。如果计算结果在哈希表中,那么就找到了两个数字,它们的和等于target。

最后,将找到的两个数字输出到控制台。

使用哈希表来实现“两数之和”算法的优点是时间复杂度为O(n),其中n是数组的长度。缺点是空间复杂度也为O(n),因为哈希表需要存储所有数字。

还有一些其他的方法可以实现“两数之和”算法,例如使用排序和二分查找。这些方法的时间复杂度可以达到O(n log n),但空间复杂度也为O(n)。