第 71 场双周赛
Problem A - 拆分数位后四位数字的最小和
方法一:贪心
最小的两个数字排在十位,较大的两个数字排在个位。
- 时间复杂度。
- 空间复杂度。
参考代码(Python 3)
class Solution:
    def minimumSum(self, num: int) -> int:
        d = sorted(list(map(int, str(num))))
        return (d[0] + d[1]) * 10 + d[2] + d[3]
Problem B - 根据给定数字划分数组
方法一:模拟
按要求模拟即可。
- 时间复杂度。
- 空间复杂度。
参考代码(Python 3)
class Solution:
    def pivotArray(self, nums: List[int], pivot: int) -> List[int]:
        small = [num for num in nums if num < pivot]
        large = [num for num in nums if num > pivot]
        return small + [pivot] * (len(nums) - len(small) - len(large)) + large
Problem C - 设置时间的最少代价
方法一:暴力
因为输入 0 是没有意义的,所以暴力枚举所有范围内的正整数即可。
- 时间复杂度。
- 空间复杂度。
参考代码(C++)
class Solution {
public:
    int minCostSetTime(int startAt, int moveCost, int pushCost, int targetSeconds) {
        int ans = INT_MAX;
        for (int i = 1; i <= 9999; ++i) {
            int result = i / 100 * 60 + i % 100;
            if (result != targetSeconds)
                continue;
            
            string s = to_string(i);
            int cost = 0;
            char curr = startAt + '0';
            for (char ch : s) {
                if (curr == ch)
                    cost += pushCost;
                else {
                    curr = ch;
                    cost += moveCost + pushCost;
                }
            }
            ans = min(ans, cost);
        }
        return ans;
    }
};
Problem D - 删除元素后和的最小差值
方法一:堆
转变思路,考虑从前面和后面各选取 个数。显然,前面需要选最小的,后面需要选最大的。为了避免动态调整带来的思维难度,我们预处理得到左右的结果,最后枚举分界点得到答案。
- 时间复杂度。
- 空间复杂度。
参考代码(C++)
using ll = long long;
class Solution {
public:
    ll minimumDifference(vector<int>& nums) {
        int n = nums.size() / 3;
        ll ans = LLONG_MAX;
        
        vector<ll> L(3 * n), R(3 * n);
        ll lsum = 0;
        
        priority_queue<int> pq;
        for (int i = 0; i < 2 * n; ++i) {
            pq.push(nums[i]);
            lsum += nums[i];
            
            if (pq.size() > n) {
                lsum -= pq.top();
                pq.pop();
            }
            
            L[i] = lsum;
        }
        
        ll rsum = 0;
        priority_queue<int, vector<int>, greater<>> pq2;
        for (int i = n * 3 - 1; i >= n; --i) {
            pq2.push(nums[i]);
            rsum += nums[i];
            
            if (pq2.size() > n) {
                rsum -= pq2.top();
                pq2.pop();
            }
            
            R[i] = rsum; 
        }
        for (int i = n - 1; i < 2 * n; ++i)
            ans = min(ans, L[i] - R[i + 1]);
        
        return ans;
    }
};