Leetcode刷题 2021.02.20

Leetcode刷题 2021.02.20

  • Leetcode1457 二叉树中的伪回文路径
  • Leetcode1481 不同整数的最少数目
  • Leetcode1395 统计作战单位数

Leetcode1457 二叉树中的伪回文路径

给你一棵二叉树,每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的,当它满足:路径经过的所有节点值的排列中,存在一个回文序列。

请你返回从根到叶子节点的所有路径中 伪回文 路径的数目。

明天要回上海了,每年的这个时候都感概万分,想很多事。再回来的时候还会这么热闹吗,明年爷爷奶奶身体健康吗,两个姐姐嫁出去了吗?
每年走的时候都会许个愿望,希望下次回来的时候能达成。过去几年的愿望基本都满足了,今年就希望拿个大厂的offer吧。
每年车开走的时候,奶奶总会看着我们开走,也希望老人家能一切平安吧。话说今年五一弟弟要办婚礼,两个月又要回来了。(lll¬ω¬)
今天没空详细写博客了,明天再整理吧。

class Solution {
    int res = 0;
    public int pseudoPalindromicPaths (TreeNode root) {
        int[] map = new int[10];
        helper(root, map);
        return res;
    }

    private void helper(TreeNode root, int[] map){
        if (root == null) return;
        map[root.val]++;
        if (root.left == null && root.right == null && isPali(map)){
            res++;
        }
        helper(root.left, map);
        helper(root.right, map);
        map[root.val]--;
    }

    private boolean isPali(int[] map){
        int count = 1;
        for(int i = 0; i < 10; i++){
            if (map[i] % 2 != 0){
                count--;
                if (count < 0) return false;
            }
        }
        return true;
    }
}

Leetcode1481 不同整数的最少数目

给你一个整数数组 arr 和一个整数 k 。现需要从数组中恰好移除 k 个元素,请找出移除后数组中不同整数的最少数目。

class Solution {
    public int findLeastNumOfUniqueInts(int[] arr, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        for(int num : arr){
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        int n = map.size();
        int[] help = new int[n];
        int index = 0;
        for(Integer key : map.keySet()){
            help[index++] = map.get(key);
        }
        Arrays.sort(help);
        // System.out.println(Arrays.toString(help));
        for(int i = 0; i < help.length; i++){
            if (help[i] <= k){
                k -= help[i];
                n--;
                // System.out.println(n);
            }else{
                break;
            }
        }
        return n;
    }
}

Leetcode1395 统计作战单位数

n 名士兵站成一排。每个士兵都有一个 独一无二 的评分 rating 。

每 3 个士兵可以组成一个作战单位,分组规则如下:

从队伍中选出下标分别为 i、j、k 的 3 名士兵,他们的评分分别为 rating[i]、rating[j]、rating[k]
作战单位需满足: rating[i] < rating[j] < rating[k] 或者 rating[i] > rating[j] > rating[k] ,其中 0 <= i < j < k < n
请你返回按上述条件可以组建的作战单位数量。每个士兵都可以是多个作战单位的一部分。

class Solution {
    public int numTeams(int[] rating) {
        int n = rating.length, res = 0;
        int[] large = new int[n];
        int[] small = new int[n];
        for(int i = 1; i < n; i++){
            for(int j = 0; j < i; j++){
                if (rating[i] > rating[j]){
                    large[i]++;
                }
                if (rating[i] < rating[j]){
                    small[i]++;
                }
            }
        }
        // System.out.println(Arrays.toString(large));
        // System.out.println(Arrays.toString(small));
        for(int i = 2; i < n; i++){
            for(int j = 1; j < i; j++){
                if (rating[i] > rating[j]){
                    res += large[j];
                }
                if (rating[i] < rating[j]){
                    res += small[j];
                }
            }
        }
        return res;
    }
}

你可能感兴趣的:(刷题)