leetcode 1-20题

Mr.Hdd算法题大约 3 分钟...

Leetcode 1-20

1.两数之和

1. 两数之和 - 力扣(LeetCode)open in new window

找出数组中两个和为 target 的数的索引。

【初始想法】使用两重 for 循环, 时间复杂度 o(n^2 / 2)

pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
  let mut ans:Vec<i32> = vec![];
  for i in 0..nums.len(){
    for j in i+1..nums.len(){
      if nums[i] + nums[j] == target { 
        ans.push(i as i32);
        ans.push(j as i32);
      }
    }
  }
  ans
}

注意

不管是二分还是查哈希表,查的都是全范围。那么就有如下问题: 如果数组中有一个数为 3, target = 6, 由于我遍历方式的原因, 那么就有可能查到多次 3,解决这个问题只需判断一下两个索引是否相同即可。

2.两数相加

2. 两数相加 - 力扣(LeetCode)open in new window

#[derive(PartialEq, Eq, Clone, Debug)]
pub struct ListNode {      // 单链表节点
  pub val: i32,
  pub next: Option<Box<ListNode>>,
}

impl ListNode {
  #[inline]
  fn new(val: i32) -> Self {
    ListNode { next: None, val }
  }
}

pub fn add_two_numbers( l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>,) -> Option<Box<ListNode>> {
  rec(l1, l2, 0)
}

pub fn rec(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>, mut carry: i32) -> Option<Box<ListNode>> {

  // 当两个节点有一个为空且给这个两个节点的进位为空时,加法结束
  if l1.is_none() && l2.is_none() && carry == 0 { None }
  else {
    Some(Box::new(ListNode{
      next: rec(
        l1.and_then(|x| { carry += x.val ; x.next}),
        l2.and_then(|x| { carry += x.val ; x.next }),
        carry / 10    // 进位
      ),
      val: carry % 10   // 进位后的余位       
    }))
  }
}

3.无重复字符的最长子串

3. 无重复字符的最长子串 - 力扣(LeetCode)open in new window

/// i        i       i       i       i
/// abccd   abccd  abccd  abccd  abccd
/// j       j        j       j      j 
/// 维护 [i, j] 区间中每个字符的出现的次数 
pub fn length_of_longest_substring(s: String) -> i32 {
  let mut ans = 0;
  let n = s.len();
  // <char, u32> 记录每个字符在 [i, j] 区间中出现的次数
  let mut mp = HashMap::<char, u32>::new();

  // 将 String 转为 Vec<char>
  let vc: Vec<char> = s.chars().collect();

  // 双指针扫描区间
  let mut j = 0;
  for i in 0..n {
    match mp.get_mut(&vc[i]) {
      Some(x) => *x += 1,
      None => {
        mp.insert(vc[i], 1); ()
      }
    }
    while mp.get(&vc[i]).unwrap() > &1 {
      mp.get_mut(&vc[j]).and_then(|x| Some(*x -= 1));
      j += 1;
    }
    ans = std::cmp::max(ans, (i - j + 1) as i32);
  }
  ans
}
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.14.9