LeetCode--貪心算法

一、有N個孩子站成一排。 爲每一個孩子分配一個評級值。
您正在爲這些孩子提供糖果,符合如下要求:
每一個孩子必須至少有一個糖果。
評分較高的兒童得到的糖果多於鄰居。
你必須給予的最低糖果是多少?數組

思路:ui

首先從左到右依次遍歷,若右邊小孩的評分高於左邊,則右邊的小朋友獲得的糖果比左邊小朋友獲得的多1個spa

而後,在從最右邊的小朋友依次向左邊的小朋友遍歷,若左邊的小朋友的評分大於右邊的小朋友,且右邊的小朋友獲得的糖果大於他左邊的小朋友,則左邊的小朋友糖果比右邊的小朋友多1個code

class Solution {
public:
    int candy(vector<int> &ratings) {
        int n = ratings.size();
        if(n<=1) return n;
        //初始將每一個孩子的糖果數都設爲1
        vector<int> num(n,1);
        int sum=0;
        //從左向右掃描,保證一個方向上分數更大的糖果更多
        for(int i=1;i<n;i++)
            if(ratings[i]>ratings[i-1]) num[i]=num[i-1]+1;
        //從右向左掃描,保證另外一個方向上分數更大的糖果更多
        for(int i=n-2;i>=0;i--)
            if(ratings[i]>ratings[i+1] && num[i]<=num[i+1]) num[i]=num[i+1]+1;
        for(int i=0;i<n;i++)
            sum += num[i];
        return sum;
    }
};

二、沿着環形路線有N個加油站,其中站i的氣體量是gas[i]。
你有一輛裝有無限油箱的汽車,從車站i到下一站(i + 1)須要花費cost[i]氣。 您能夠在其中一個加油站開始使用空罐。
若是您能夠在環形路線行駛一次,則返回起始加油站的索引,不然返回-1。blog

思路:索引

令環形公路的最後一站爲汽車的起始站,則下一站一定爲環形公路的第一站,汽車每行駛一站,則剩下的油應爲上一站剩下的油和這一站剩餘油的總和,若該總和大於0,則能夠開始行駛下一站,若油不夠,則汽車的初始車站將變動,即始點爲終點it

class Solution {
public:
    int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
        int n = gas.size();
        int start = n-1;
        int end = 0;
        int sum = gas[start] - cost[start];
        while(start > end){
            if(sum>=0){
                sum += gas[end] - cost[end];
                ++end;
            }else{
                --start;
                sum += gas[start] - cost[start];
            }
        }
        return sum>=0 ? start:-1;
    }
};

三、給定一個非負整數數組,您最初定位在數組的第一個索引處。
數組中的每一個元素表示該位置的最大跳轉長度。
您的目標是以最小跳躍次數到達最後一個索引。
例如:
給定數組A = [2,3,1,1,4]
到達最後一個索引的最小跳轉次數是2。 (Jump1step從索引0到1,而後3步到最後一個索引。)io

class Solution {
public:
    int jump(int A[], int n) {
        int jumps = 0, curEnd = 0, curFarthest = 0;
        for (int i = 0; i < n - 1; i++) {
            curFarthest = max(curFarthest, i + A[i]);
            if (i == curEnd) {
                jumps++;
                curEnd = curFarthest;
            }
        }
        if(curEnd < n-1) //判斷一下有沒有到達數組的尾部位置
            jumps = 0;
        return jumps;
    }
};
相關文章
相關標籤/搜索