上岸算法 I LeetCode Weekly Contest 216解题报告

No.1 检查两个字符串数组是否相等

解题思路

String.join!!!

代码展示

class Solution {

    public boolean arrayStringsAreEqual(String[] word1, String[] word2) {

        return String.join("", word1).equals(String.join("", word2));

    }

}

No.2 具有给定数值的最小字符串

解题思路

贪心, 每次用的字符越小越好.

代码展示

class Solution {

    public String getSmallestString(int n, int k) {

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < n; i++) {

            int c = 1;

            while ((n - i - 1) * 26 + c < k) c++;

            k -= c;

            sb.append((char) (c - 1 + 'a'));

        }

        return sb.toString();

    }

}

No.3 生成平衡数组的方案数

解题思路

前缀和稍作改动: 只包含原奇数下标的前缀和以及偶数下标的前缀和.

使用这两个前缀和就可以快速计算出删除一个数字后的新奇偶下标的元素和.

代码展示

class Solution {

    public int waysToMakeFair(int[] nums) {

        // oddSum[i] 表示 i 位置之后的所有原奇数下标元素的和

        // oddSum[0] == oddSum[1], oddSum[2] == oddSum[3]...

        int[] oddSum = new int[nums.length + 1];  // + 1 避免越界

        int[] eveSum = new int[nums.length + 1];

        int n = nums.length;

        oddSum[n - 1] = (n - 1) % 2 == 1 ? nums[n - 1] : 0;

        eveSum[n - 1] = (n - 1) % 2 == 0 ? nums[n - 1] : 0;

        for (int i = n - 2; i >= 0; i--) {

            oddSum[i] = oddSum[i + 1] + (i % 2 == 1 ? nums[i] : 0);

            eveSum[i] = eveSum[i + 1] + (i % 2 == 0 ? nums[i] : 0);

        }

        int res = 0;

        for (int i = 0; i < n; i++) {

            int odd = oddSum[0] - oddSum[i] + eveSum[i + 1];

            int eve = eveSum[0] - eveSum[i] + oddSum[i + 1];

            res += odd == eve ? 1 : 0;

        }

        return res;

    }

}

No.4 完成所有任务的最少初始能量

解题思路

实际上我们并不需要关心真正的顺序, 只需要关心 “差值” 和最大的启动值就可以了.

tot 表示实际消耗的总能量和.

minDiff 表示启动值和实际耗费的差中的最小值.

maxStart 表示所有任务中, 起始能量最高的.

最终答案是 tot + minDiff 或 maxStart

代码展示

class Solution {

    public int minimumEffort(int[][] tasks) {

        int tot = 0, minDiff = 10000, maxStart = 0;

        for (int[] task : tasks) {

            tot += task[0];

            maxStart = Math.max(maxStart, task[1]);

            minDiff = Math.min(minDiff, task[1] - task[0]);

        }

        return Math.max(maxStart, tot + minDiff);

    }

}

你可能感兴趣的:(上岸算法 I LeetCode Weekly Contest 216解题报告)