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