Candy

There are N children standing in a line. Each child is assigned a rating value.

You are giving candies to these children subjected to the following requirements:

  • Each child must have at least one candy.
  • Children with a higher rating get more candies than their neighbors.

What is the minimum candies you must give?

分析: 主要问题是可以从左升序或者从右升序,如何取大值。

方法一:从左从右分别计算一次,对值校正。并计算出最大值。要保存中间初步的值,空间复杂度:O(n)

class Solution {
public:
int candy(vector<int> &ratings) {
int n = ratings.size();
if(n == 0) return 0;
int totalCandy = 0;
int *getCandy = new int[n];
getCandy[0] = 1;
for(int i = 1; i < n; ++i)
if(ratings[i] > ratings[i-1]) getCandy[i] = getCandy[i-1] + 1;
else getCandy[i] = 1;
totalCandy += getCandy[n-1];
for(int i = n-1; i > 0; --i) {
if(ratings[i-1] > ratings[i]) getCandy[i-1] = max(getCandy[i-1], getCandy[i]+1);
totalCandy += getCandy[i-1];
}
delete[] getCandy;
return totalCandy;
}
};

方法二:从一个方向(此题从左),设置两个变量,通过计算升序长度,降序长度确定精确值。空间复杂度:O(1)

class Solution {
public:
int candy(vector<int> &ratings) {
int LA = 0, LD = 0; // 利用降序长度和升序长度,来求结果。
bool decend = false;
int totalCandy = ratings.size();
for(int i = 1; i < ratings.size(); ++i) {
if(ratings[i-1] < ratings[i]) {
if(LA == 0 || decend == true) LA = 2;//考虑情况:之前为降序,重新设置升序长度
else ++LA;
LD = 0; decend = false; //升序时不需要知道之前降序长度。
totalCandy += (LA - 1);
}else if(ratings[i-1] > ratings[i]) {
decend = true;
if(LD == 0) LD = 2;
else ++LD;
if(LD <= LA) totalCandy += (LD - 2);
else totalCandy += (LD - 1);
}else {
LA = LD = 0; // 出现相同字符,则从第二个重复字符重新开始
}
}
return totalCandy;
}
};

Gas Station

There are N gas stations along a circular route, where the amount of gas at station i is gas[i].

You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from station i to its next station (i+1). You begin the journey with an empty tank at one of the gas stations.

Return the starting gas station's index if you can travel around the circuit once, otherwise return -1.

Note: The solution is guaranteed to be unique.

方法一: 直接计算。(752ms)

class Solution {
public:
int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
int n = gas.size();
if(n == 1) return gas[0] >= cost[0] ? 0 : -1;
int tank = 0;
for(int i = 0; i < n; ++i) {
int j = i;
for(; j < n; ++j) {
tank += gas[j];
if(tank < cost[j]) break;
tank = tank - cost[j];
}
if(j == n) {
for(j = 0; j < i; ++j) {
tank += gas[j];
if(tank < cost[j]) break;
tank = tank - cost[j];
}
if(j == i) return i;
}
tank = 0;
}
return -1;
}
};

方法二:计算出每个站的油余量:(即从该站开始到下一站,还能剩余的油),将负数或者之前为非负数的值剔除。(20ms)

bool judge(int s, int e, int& cnt, vector<int> &gas) {
for(int j = s; j < e; ++j) {
cnt += gas[j];
if(cnt < 0) return false;
}
return true;
}
class Solution {
public:
int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
int count = 0;
for(int i = 0; i < gas.size(); ++i) gas[i] -= cost[i];
for(int i = 0; i < gas.size(); ++i) {
if(gas[i] < 0) continue;
else if(i > 0 && gas[i-1] >= 0) continue;
if(judge(i, gas.size(), count, gas) && judge(0, i, count, gas)) return i;
count = 0;
}
return -1;
}
};

20. Candy && Gas Station的更多相关文章

  1. PAT 1072. Gas Station (30)

    A gas station has to be built at such a location that the minimum distance between the station and a ...

  2. 1072. Gas Station (30)

    先要求出各个加油站 最短的 与任意一房屋之间的 距离D,再在这些加油站中选出最长的D的加油站 ,该加油站 为 最优选项 (坑爹啊!).如果相同D相同 则 选离各个房屋平均距离小的,如果还是 相同,则 ...

  3. PAT_1072 Gas Station

    1072. Gas Station (30) 时间限制  200 ms 内存限制  32000 kB 代码长度限制  16000 B 判题程序    Standard 作者    CHEN, Yue ...

  4. A1072. Gas Station

    A gas station has to be built at such a location that the minimum distance between the station and a ...

  5. PAT 1072 Gas Station[图论][难]

    1072 Gas Station (30)(30 分) A gas station has to be built at such a location that the minimum distan ...

  6. [LeetCode 题解]:Gas Station

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 There are ...

  7. pat 甲级 1072. Gas Station (30)

    1072. Gas Station (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A gas sta ...

  8. 1072 Gas Station (30)(30 分)

    A gas station has to be built at such a location that the minimum distance between the station and a ...

  9. 1072. Gas Station (30)【最短路dijkstra】——PAT (Advanced Level) Practise

    题目信息 1072. Gas Station (30) 时间限制200 ms 内存限制65536 kB 代码长度限制16000 B A gas station has to be built at s ...

随机推荐

  1. 超链接<a></a>

    1.<a href="#" target="_self原窗口-默/_blank新窗口/_top/_parent"></a> 绝对路径:f ...

  2. 黑马程序员——OC语言Foundation框架 NSArray NSSet NSDictionary\NSMutableDictionary

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一) NSNumber 将各种基本数据类型包装成NSNumber对象 @ ...

  3. jQuery.extend源码深层分析

    在网站的开发中,经常会自己写一些jQuery插件来方便使用,其中自然少不了一个关键的方法->jQuery.extend(),使用这个方法来扩展jQuery对象. 那么今天就来讲讲这个函数的实现原 ...

  4. python3批量删除豆瓣分组下的好友

    python3批量删除豆瓣分组下的好友 """ python3批量删除豆瓣分组下的好友 2016年6月7日 03:43:42 codegay 我两年前一时冲动在豆瓣关注了 ...

  5. 你会用Python做出装逼的东西吗

    如果我回答:“用Python很牛逼,但不能做出装逼的东西”,那大家来学习“小白的Python入门教程 ”,还有多少意义? 所以,为了让装逼的小船升级为牛逼的巨轮,让大家学完“小白的Python入门教程 ...

  6. [深入Python]Python的私有变量

    Python没有真正的私有变量.内部实现上,是将私有变量进程了转化,规则是:_<类名><私有变量> 下面的小技巧可以获取私有变量: class Test(object): de ...

  7. 福州月赛2057 DFS

    题意:告诉你族谱,然后Q条查询s和t的关系,妈妈输出M,爸爸输出F: 题目地址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=78233# ...

  8. SQL视图与触发器

    视图(虚拟的表) select查询出来的结果集可以用as起别名当作虚拟表来使用 视图只能添加使用不能添加修改 视图不能建在其他视图上,只能一其他实体表作为基础 视图表的数据会随实体表的变动而变动 视图 ...

  9. 纯js轮播效果(减速效果)待改进

    HTML代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  10. Python::OS 模块 -- 进程管理

    os模块的简介参看 Python::OS 模块 -- 简介 os模块的文件相关操作参看 Python::OS 模块 -- 文件和目录操作 os模块的进程参数 Python::OS 模块 -- 进程参数 ...