// [2,7,11,15] 9
// [3,2,4] 6
// [3,3] 6
//暴力枚举
pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<usize> {
let n = nums.len();//数组长度
for i in 0..n {//i 一级索引
for j in (i + 1)..n {// j 二级索引 二层用i+1可以优化无用重复匹配和匹配本身
if nums[i] + nums[j] == target {
return vec![i, j];
}
}
}
vec![]
}
use std::collections::HashMap;
//哈希表 最好情况2次 最差情况n次 On复杂度 空间复杂度On 取决于数组长度
pub fn two_sum2(nums: Vec<i32>, target: i32) -> Vec<i32> {
let mut register: HashMap<i32, i32> = HashMap::new();
let mut location: Vec<i32> = vec![];
for (index, val) in nums.iter().enumerate() {// iter() 获取对象的引用 enumerate()返回元组 使用场景:前索后值
match register.get(&(target - val)) {//get就是用的引用参数 计算结果是i32 无论是否引用
None => {//前几个就是用来装进去的,最优结果第二次匹配到了
register.insert(*val, index as i32);
}
Some(i) => {
location.push(*i);//get的索引解引用
location.push(index as i32);//
}
}
}
return location;
}
//宏调用会有返回值
fn main() {
assert_eq!(two_sum(vec![2,7,11,15],9),vec![0,1]);
assert_eq!(two_sum(vec![3,2,4],6),vec![1,2]);
assert_eq!(two_sum(vec![3,3],9),vec![]);
assert_eq!(two_sum2(vec![2,7,11,15],9),vec![0,1]);
assert_eq!(two_sum2(vec![3,2,4],6),vec![1,2]);
assert_eq!(two_sum2(vec![3,3],9),vec![]);
}