LeetCode Biweekly Contest 62

上周比赛没打(折腾人),今天比赛比较简单,最后一题比较迟钝

T1: Convert 1D Array Into 2D Array

先判断是否可行再暴力模拟即可

T2: Number of Pairs of Strings With Concatenation Equal to Target

枚举暴力即可

T3: Maximize the Confusion of an Exam

分别计算转成T或者转成F,求两者最大值。可以直接用线性扫描O(N)复杂度解决。

T4: Maximum Number of Ways to Parition an Array

假设等式替换为Left-Right,枚举某个数进行变动,那么如果这个数在等式左侧,那么 左侧Left为变动为k-num,那么只需要知道左侧这部分差值为k-num,同理右侧也是,两者 求和即可

public int waysToPartition(int[] nums, int k) {
    HashMap<Long, Integer> rmap = new HashMap<>();
    HashMap<Long, Integer> lmap = new HashMap<>();
    long cnt = 0;
    long now = 0;
    for(int num : nums) {
        cnt += num;
    }
    long left = 0;
    long right = cnt;
    for(int i=0;i<nums.length-1;i++) {
        left += nums[i];
        right -= nums[i];
        long v = left - right;
        rmap.put(v, rmap.getOrDefault(v, 0) + 1);
    }
    int ans = rmap.getOrDefault(0l,0);
    for(int i=0;i<nums.length;i++) {
        now += nums[i];
        cnt -= nums[i];
        long v = now - cnt;
        long diff = k - nums[i];
        ans = Math.max(ans, lmap.getOrDefault(diff, 0) + rmap.getOrDefault(-diff,0));
        if (i != nums.length-1) {
            rmap.put(v, rmap.get(v) - 1);
            lmap.put(v, lmap.getOrDefault(v, 0) + 1);
        }
    }
    return ans;
}