程式碼隨想錄演算法訓練營第三十五天 | 1005.K次取反後最大化的陣列和 134.加油站 135.分發糖果

深蓝von發表於2024-06-10

1005.K次取反後最大化的陣列和

題目連結 文章講解 影片講解

思路:
  按絕對值從大到小排序
  遍歷陣列,遇到負數,如果次數未用完就取反
  最後如果剩餘次數未用完且為奇數就將陣列最後一個元素取反

class Solution {
    static bool myCompare(const int& lhs, const int& rhs) {
        return abs(lhs) > abs(rhs);
    }
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        int result = 0;
        sort(nums.begin(), nums.end(), myCompare);
        for(int i = 0; i < nums.size(); ++i) {
            if(nums[i] < 0 && k > 0) {
                nums[i] *= -1;
                --k;
            }
        }
        // 處理剩餘的次數
        if(k % 2 == 1) nums[nums.size() - 1] *= -1;

        for(int val : nums) result += val;
        return result;
    }
};

134.加油站

題目連結 文章講解 影片講解

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        // 記錄最後剩餘的油量
        int totalSum = 0;
        // 記錄當前剩餘的油量
        int curSum = 0;
        int startIndex = 0;
        for(int i = 0; i < gas.size(); ++i) {
            curSum += (gas[i] - cost[i]);
            totalSum += (gas[i] - cost[i]);
            // 如果當前剩餘油量為負數,那麼從下一個位置開始重新記錄
            if(curSum < 0) {
                startIndex = i + 1;
                curSum = 0;
            }
        }
        if(totalSum < 0) return -1;
        return startIndex;
    }
};

135.分發糖果

題目連結 文章講解 影片講解

思路:
  先從左向右遍歷,如果當前孩子的分數相較於前者高,則糖果數為前者加一
  如果沒有前者高則預設為1
  再從後向前遍歷,如果當前孩子得分比後者高,則再當前糖果和後者糖果加一的糖果數中取更大的一個
  同時累加總的糖果數

class Solution {
public:
    int candy(vector<int>& ratings) {
        int total = 0;
        vector<int> candys(ratings.size(), 1);
        // 從前向後遍歷,保證比左邊的孩子得分高者符合要求
        for(int i = 1; i < ratings.size(); ++i) {
            if(ratings[i] > ratings[i - 1]) {
                candys[i] = candys[i - 1] + 1;
            }
        }
        total += candys[ratings.size() - 1];
        // 從右向左遍歷,保證比右邊孩子得分高者符合要求
        for(int i = ratings.size() - 2; i >= 0; --i) {
            if(ratings[i] > ratings[i + 1]) candys[i] = max(candys[i], candys[i + 1] + 1);
            total += candys[i];
        }
        return total;
    }
};

相關文章