一、有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; } };