第 216 场周赛
Problem A - 检查两个字符串数组是否相等
没啥可说的,Python大法好。
- 时间复杂度。
 - 空间复杂度。
 
参考代码(Python 3)
class Solution:
    def arrayStringsAreEqual(self, word1: List[str], word2: List[str]) -> bool:
        return ''.join(word1) == ''.join(word2)
Problem B - 具有给定数值的最小字符串
贪心,如果当前能设为'a'就设为'a',如果不能的话(会导致后面全放'z'和也不够),就假设后面已经都放了'z',然后给当前位置放剩下的那个字母。
- 时间复杂度。
 - 空间复杂度。
 
参考代码(C++)
class Solution {
public:
    string getSmallestString(int n, int k) {
        string s;
        while (n > 0) {
            if ((k - 1) <= 26 * (n - 1))
                s.push_back('a'), k--;
            else {
                char c = 'a' + k - 1 - 26 * (n - 1);
                s.push_back(c);
                k -= c - 'a' + 1;
            }
            n--;
        }
        return s;
    }
};      
Problem C - 生成平衡数组的方案数
分别计算奇数和偶数位置的前缀和,然后枚举删除的元素即可。
- 时间复杂度。
 - 空间复杂度。
 
参考代码(C++)
class Solution {
public:
    int waysToMakeFair(vector<int>& nums) {
        int ans = 0;
        int n = nums.size();
        vector<int> odd(n + 1), even(n + 1);
        for (int i = 0; i < n; ++i) {
            even[i + 1] = even[i], odd[i + 1] = odd[i];
            if (i % 2 == 0)
                even[i + 1] += nums[i];
            else
                odd[i + 1] += nums[i];
        }
        for (int i = 0; i < n; ++i) {
            int osum, esum;
            if (i % 2 == 0) {
                osum = odd[i + 1] + even[n] - even[i + 1];
                esum = even[i] + odd[n] - odd[i + 1];
            } else {
                osum = odd[i] + even[n] - even[i + 1];
                esum = even[i] + odd[n] - odd[i + 1];
            }
            if (osum == esum)
                ans++;
        }
        return ans;
    }
};
Problem D - 完成所有任务的最少初始能量
贪心。我们希望最后的剩余最小,所以就按照剩余能量()从大到小排序,优先进行剩余能量大的任务,这样最后的剩余就会最小。
- 时间复杂度。我们进行了排序。
 - 空间复杂度。我们只使用了常数的额外空间。
 
参考代码(C++)
class Solution {
public:
    int minimumEffort(vector<vector<int>>& tasks) {
        int n = tasks.size();
        sort(tasks.begin(), tasks.end(), [](vector<int> &p, vector<int> &q) {
            return p[1] - p[0] > q[1] - q[0] || (p[1] - p[0] == q[1] - q[0] && p[1] > q[1]); 
        });
        int ans = 0, curr = 0;
        for (auto &task : tasks) {
            if (curr < task[1]) {
                ans += task[1] - curr;
                curr = task[1];
            }
            curr -= task[0];
        }
        return ans;
    }
};