822. Card Flipping Game

On a table are N cards, with a positive integer printed on the front and back of each card (possibly different).

We flip any number of cards, and after we choose one card. 

If the number X on the back of the chosen card is not on the front of any card, then this number X is good.

What is the smallest number that is good?  If no number is good, output 0.

Here, fronts[i] and backs[i] represent the number on the front and back of card i

A flip swaps the front and back numbers, so the value on the front is now on the back and vice versa.

Example:

Input: fronts = [1,2,4,4,7], backs = [1,3,4,1,3]
Output: 2
Explanation: If we flip the second card, the fronts are [1,3,4,4,7] and the backs are [1,2,4,1,3].
We choose the second card, which has number 2 on the back, and it isn't on the front of any card, so 2 is good.

 

Note:

  1. 1 <= fronts.length == backs.length <= 1000.
  2. 1 <= fronts[i] <= 2000.
  3. 1 <= backs[i] <= 2000.

Rust Solution

struct Solution;
use std::collections::HashSet;

impl Solution {
    fn flipgame(fronts: Vec<i32>, backs: Vec<i32>) -> i32 {
        let n = fronts.len();
        let mut hs: HashSet<i32> = HashSet::new();
        let mut res = std::i32::MAX;
        for i in 0..n {
            if fronts[i] == backs[i] {
                hs.insert(fronts[i]);
            }
        }
        for i in 0..n {
            if !hs.contains(&fronts[i]) {
                res = res.min(fronts[i]);
            }
            if !hs.contains(&backs[i]) {
                res = res.min(backs[i]);
            }
        }
        if res == std::i32::MAX {
            0
        } else {
            res
        }
    }
}

#[test]
fn test() {
    let fronts = vec![1, 2, 4, 4, 7];
    let backs = vec![1, 3, 4, 1, 3];
    let res = 2;
    assert_eq!(Solution::flipgame(fronts, backs), res);
}

Having problems with this solution? Click here to submit an issue on github.