LeetCode 1005K の否定と 134 のガソリンスタンドと 135 の配布キャンディー後の最大化された配列 | Code Random Record 25 番目のトレーニングキャンプ day34

貪欲なアルゴリズム 3

LeetCode 1005 K 回の否定後の配列和の最大化 2023.11.27

int largestSumAfterKNegations(vector<int>& nums, int k) {
    
    
    //sum记录数组和
    int sum = 0;
    //先排一次序,从小到大
    sort(nums.begin(), nums.end());
    //开始操作
    while (k--)
    {
    
    
        //始终对第一个操作,因为要么其是负值最小的(绝对值最大),要么是正值最小的(绝对值最小)
        nums[0] *= (-1);
        //再排序,为下一次操作准备
        sort(nums.begin(), nums.end());
    }
    //求和并返回
    for (int i = 0; i < nums.size(); i++)
        sum += nums[i];
    return sum;
}

LeetCode 134 ガソリンスタンド 2023.11.27

int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
    
    
    /*自己写的暴力求解,通过34/40,最后几个样例太大超时
        //cur记录当前油量
        int cur = 0;
        //to记录当前到达的加油站位置
        int to = -1;
        //开始遍历计算
        for (int i = 0; i < gas.size(); i++)
        {
            //to记录下一次遍历的加油站位置,初始为i
            to = i;
            //cur更新为当前加油站油量
            cur = gas[i];
            //当此时油量大于cost时进行下一次遍历计算
            while(cur >= cost[to])
            {
                //判断to是否走到最后,没走到则i++并更新cur
                if(to < gas.size()-1)
                {
                    cur -= cost[to];
                    to++;
                    cur += gas[to];
                }
                //判断to是否走到最后,走到则i=0并更新cur
                else
                {
                    cur -= cost[to];
                    to = 0;
                    cur += gas[to];
                }
                //判断是否回到了第二次遍历的起始加油站位置,到了则返回i
                if(to == i)
                    return i;
            }
        }
        //上面没返回则返回-1,没合适路线
        return -1;
        */

    //贪心算法
    //cursum记录从start开始到i的剩余流量
    int cursum = 0;
    //totalsum记录整圈的净油量(剩余油量)
    int totalsum = 0;
    //start记录开始索引
    int start = 0;
    //开始遍历计算
    for (int i = 0; i < gas.size(); i++)
    {
    
    
        //更新cursum与toatlsum
        cursum += (gas[i] - cost[i]);
        totalsum += (gas[i] - cost[i]);
        //如果cursum<0说明到达不了i加油站位置
        //那么更新起始位置为下一站,并更新cursum为0
        if(cursum < 0)
        {
    
    
            start = i + 1;
            cursum = 0;
        }
    }
    //遍历结束后,如果totalsum小于0 说明加油站油不够跑完全程,则返回-1
    if(totalsum < 0)
        return -1;
    //没返回-1则返回开始索引start
    return start;
}

LeetCode 135 キャンディー配布 2023.11.27

int candy(vector<int>& ratings) {
    
    
    //result存储最终糖果数目
    int result = 0;
    //数组记录每个学生所发糖果数,默认都为1
    vector<int> candy(ratings.size(), 1);
    //从前往后遍历,当当前遍历学生得分大于上一个学生得分时,糖果数更新为上一个学生糖果数+1
    for (int i = 0; i < ratings.size(); i++)
    {
    
    
        if(i > 0 && ratings[i] > ratings[i-1])
            candy[i] = candy[i-1] + 1;
    }
    //从后往前遍历,当当前遍历学生得分小于上一个学生得分时,
    //上一个学生糖果数更新为max(上一个学生糖果数,当前学生糖果数+1)
    for (int i = ratings.size()-1; i >= 0; i--)
    {
    
    
        if(i > 0 && ratings[i-1] > ratings[i])
            candy[i-1] = max(candy[i-1], candy[i]+1);
        result += candy[i];
    }
    return result;
}

おすすめ

転載: blog.csdn.net/weixin_66706867/article/details/134646404