20201125:力扣第216場周賽(下)

IMMUNIZE發表於2020-11-26

題目

  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. 衝!

相關文章