20201125:力扣第216场周赛(下)

力扣第216场周赛(下)

题目

  1. 生成平衡数组的方案数
    在这里插入图片描述
  2. 完成所有任务的最少初始能量
    在这里插入图片描述

思路与算法

  1. 第一题 删除的索引为i,删除之后(0- i-1)之间的子数组的奇偶和不变,而(i+1,end)的奇偶索引交换
  2. 贪心加自定义排序,代码参考自zero神的题解。

代码实现

  1. 生成平衡数组的方案数
class Solution {
    
    
    public int waysToMakeFair(int[] nums) {
    
    
        // 删除的索引为i,删除之后(0- i-1)之间的子数组的奇偶和不变,而(i+1,end)的奇偶索引交换
        int OddSum = 0;int EvenSum = 0;
        int leftOddSum = 0; int leftEvenSum = 0;
        int rightOddSum = 0;int rightEvenSum = 0;

        int res = 0;
        int len = nums.length;

        // 先计算当前奇偶索引和
        for (int i = 0; i < len; i++) {
    
    
            if(i % 2 == 0) 
                EvenSum += nums[i];
            else 
                OddSum += nums[i];
        }
        // 遍历所有可能性
        for (int i = 0; i < len; i++) {
    
    
            // 先计算左边的奇偶和
            if (i % 2 != 0) 
                leftOddSum += nums[i];
            else
                leftEvenSum += nums[i];
                
            rightOddSum = EvenSum - leftEvenSum;
            rightEvenSum = OddSum - leftOddSum;
            if (i % 2 != 0) 
                rightOddSum -= nums[i];
            else
                rightEvenSum -= nums[i];
            if ((leftEvenSum + rightEvenSum) == (leftOddSum + rightOddSum)) {
    
    
                res++;
            }
        }

        return res;

    }
}
  1. 完成所有任务的最少初始能量
class Solution {
    
    
public:
    int minimumEffort(vector<vector<int>>& tasks) {
    
    
        sort(tasks.begin(), tasks.end(), [](const vector<int> &a, const vector<int> &b) {
    
     return a[1] - a[0] > b[1] - b[0]; } );
        int ans = 0;       // 最低能量
        int cur_cost = 0;  // 实际能量
        for (int i = 0; i < tasks.size(); i++) {
    
    
            ans = max(ans, cur_cost + tasks[i][1]);
            cur_cost += tasks[i][0];
        }
        return ans;
    }

};

写在最后

  1. 冲!

猜你喜欢

转载自blog.csdn.net/qq_36828395/article/details/110154469
今日推荐