01两数之和
题目类型
array
;hash-table
思路
1、两层循环。都是从0..nums.len()
,如果等于target
,就返回。时间复杂度:On^2
// twosum.rs
pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
for i in 0..nums.len()-1 {
for j in i+1..nums.len() {
if nums[i] + nums[j] == target {
return vec![i as i32, j as i32];
}
}
}
return vec![];
}
Leetcode 结果:
执行用时 | 内存消耗 | 语言 |
---|---|---|
52 ms | 2.1 MB | Rust |
2、Hash-table
法。一遍循环,将已经见过的数字及下标存入字典,并对下一个数字判断它与target的差值是否已经在字典里出现过。时间复杂度O(n)
/*
* @lc app=leetcode.cn id=1 lang=rust
*
* [1] 两数之和
*/
// twosum.rs
pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
use std::collections::HashMap;
let mut seen_nums = HashMap::new(); // seen_nums: 保存已经见过的数字及对应索引
for (i, val) in nums.iter().enumerate() { // i: 索引,val:数值
match seen_nums.get( &(target-val) ) {
Some(seen_num) => {
return vec![ *seen_nums.get(&(target-val)).unwrap() ,i as i32]; // get 返回Option(&V); i为usize
}
None => {
seen_nums.insert(val, i as i32); // i 是 usize
}
}
}
vec![]
}
// 测试:lib.rs
mod twosum;
#[cfg(test)]
mod tests {
use crate::twosum::two_sum;
#[test]
fn test_twosum() {
assert_eq!(vec![1, 2], two_sum(vec![3, 2, 4], 6));
assert_eq!(vec![0, 1], two_sum(vec![2, 7, 11, 15], 9));
assert_eq!(vec![0, 2], two_sum(vec![-1, 33, 1, 0], 0 ));
}
}
Leetcode 结果:
执行用时 | 内存消耗 | 语言 |
---|---|---|
0 ms | 2.7 MB | Rust |
Tips
nums.iter().enumerate()
对数组进行迭代并显示下标;用 match
替代if
Leetcode 中相似的题型
136题:只有1个数字出现了一次。1. 使用异或^
; 2. 使用HashTable; 时间复杂度O(n)
961:重复N次的元素。题目中只有1个数有重复,直接使用HashSet即可。时间复杂度O(n)