LeetCode_单周赛_327
阅读原文时间:2023年07月11日阅读:1

目录

代码

直接遍历统计即可

class Solution {
    public int maximumCount(int[] nums) {
        int a = 0, b = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > 0) a++;
            else if (nums[i] < 0) b++;
        }

        return Math.max(a, b);
    }
}

代码

用最大堆即可

ceil是上取整,操作数和返回值都是 double,需要强转,可能会出现浮点错误,所以使用整数运算规避。

ceil(a / b) = (a + b - 1) / b

class Solution {
    public long maxKelements(int[] nums, int k) {
        PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });
        int n = nums.length;
        for (int i = 0; i < n; i++) pq.add(nums[i]);
        long ans = 0;
        while (k-- > 0) {
            int t = pq.peek();
            pq.poll();
            ans += t;
            // int q = (int) Math.ceil(t / 3.0);
            int q = (t + 2) / 3;
            pq.add(q);
        }

        return ans;
    }
}

代码

比赛的时候看错题了,想错了,以为暴力模拟是 1e5 x 1e5,时间不够

其实只模拟 26 个字母即可,复杂度是 26 x 26

先求出来各自不同字母的数量,还有字母映射到数组中

遍历两个哈希数组,交换字母判断即可

  1. 如果当前不存在该字母,跳过此次循环

  2. 如果两个字符串有相同字母,并且 不同字母数相同,返回 true

  3. 交换两个字符,判断两字符串不同字母个数是否相同即可

    class Solution {
    public boolean isItPossible(String s1, String s2) {
    int[] a = new int[26], b = new int[26];
    int x = 0, y = 0;
    for (int i = 0; i < s1.length(); i++) {
    int t = s1.charAt(i) - 'a';
    a[t]++;
    if (a[t] == 1) x++;
    }
    for (int i = 0; i < s2.length(); i++) {
    int t = s2.charAt(i) - 'a';
    b[t]++;
    if (b[t] == 1) y++;
    }
    // System.out.println(x + " " + y + " " + get_count(a) + " " + get_count(b));
    for (int i = 0; i < 26; i++) {
    if (a[i] == 0) continue;
    for (int j = 0; j < 26; j++) {
    if (b[j] == 0) continue;
    if (i == j) if (x == y) return true;
    a[i]--;
    a[j]++;
    b[i]++;
    b[j]--;
    if (get_count(a) == get_count(b)) return true;
    a[i]++;
    a[j]--;
    b[i]--;
    b[j]++;
    }
    }

        return false;
    }
    
    private int get_count(int[] a) {
        int ans = 0;
        for (int i = 0; i < 26; i++) {
            if (a[i] > 0) ans++;
        }
        return ans;
    }

    }