Two Sum in Rust

problem

two sum

解析

先考虑最直接的暴力方法,然后分析时间空间复杂度,进而根据算法动作,分析可能的优化或者转换。
这里我们是找某个数并返回其index,因而可以想到hashmap
rust语言注意for与一般的用法不同
for 默认usize
给出A/B/C/D/E方法,多种变化。B考虑把Option的match转换成map_or_else(),有点复杂,放弃。

答案

impl Solution {
    pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
        let n = nums.len();
        for i in 0..n {
            for j in i+1..n {
                if nums[i] + nums[j] == target {
                    return vec![i as i32, j as i32];
                }
            } 
        }
        // return vec![];
        // vec![]
        unreachable!()
    }
}
*/
// complex analysis: 
// time: action by action, O(n2), space: O(1)
// improve the last action , time vs space or essience to find index hashmap(v,index)
use std::collections::HashMap;
use std::convert::TryFrom;
impl Solution {
    pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
       // A
        let mut comps: HashMap<i32, i32> = HashMap::new();
        for i in 0..nums.len() {
            // match to map
            match comps.get(&nums[i]) {
                Some(&x) => return vec![x, i as i32],
                None => comps.insert(target - nums[i], i as i32)
            };
        }
      // B
      //  let mut comps: HashMap<i32, i32> = HashMap::new();
      //  for i in 0..nums.len() {

      //      let mut result = comps.get(&nums[i]).map_or_else(|| { comps.insert(target -nums[i], i as i32); vec![]}, 
      //                                      |x| vec![x, i32::try_from(i).as_ref().unwrap()]);
      //      if result.is_empty() && (i < nums.len() - 1) {
      //          continue;
      //      } else {
      //          result
      //      };                             

      //  }
      // C
       // one improve: let mut index_hashmap = HashMap::with_capacity(nums.len());
      // D
       // let mut seen = HashMap::new();// no need specify type later will
       // for (i, num) in nums.iter().enumerate() { //use tuple,enumerate return tuple iter
       //     if seen.contains_key(num) {
       //         return vec![seen[num] as i32, i as i32];
       //     } else {
       //         seen.insert(target - num, i); // can use two push 
       //     }
       // }
       // here we can also use if let Some(&k) = seen.get(&(target -num)) 
       //                                 return vec![k as i32, i as i32];
       //                        } else {
       //                            seen.insert(target - num, i);
       //                        }
       // E

//        let mut dict: HashMap<&i32, usize>  = HashMap::new();
//        let mut res: Vec<i32> = vec![0; 2];
//        for (i, item) in nums.iter().enumerate(){
//            if dict.contains_key(&(target-item)) {
//                res[0] = dict[&(target-item)] as i32;
//                res[1] = i as i32;
//                return res;
//            }
//            else {
//                dict.insert(item, i);
//            }
//        } 


        vec![]
    }
}
Webmentions

Loading...

When you post a tweet with a link to this post it will automatically show up here! (refreshed every 30 minutes) 💯

A small favor

Was anything I wrote confusing, outdated, or incorrect? Please let me know! Just write a few words below and I'll be sure to amend this post with your suggestions.

Follow along

If you want to know about new posts, add your email below. Alternatively, you can subscribe with RSS.

More from 格物治用

实践、探索、思考.

View all posts