20. Candy && Gas Station
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的更多相关文章
- 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 ...
- 1072. Gas Station (30)
先要求出各个加油站 最短的 与任意一房屋之间的 距离D,再在这些加油站中选出最长的D的加油站 ,该加油站 为 最优选项 (坑爹啊!).如果相同D相同 则 选离各个房屋平均距离小的,如果还是 相同,则 ...
- PAT_1072 Gas Station
1072. Gas Station (30) 时间限制 200 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...
- A1072. Gas Station
A gas station has to be built at such a location that the minimum distance between the station and a ...
- PAT 1072 Gas Station[图论][难]
1072 Gas Station (30)(30 分) A gas station has to be built at such a location that the minimum distan ...
- [LeetCode 题解]:Gas Station
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 There are ...
- pat 甲级 1072. Gas Station (30)
1072. Gas Station (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A gas sta ...
- 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 ...
- 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 ...
随机推荐
- WP8.1 Study17:网络之后台下载/上传及HttpClient
一.后台下载/上传 1.简介 使用BackgroundTransferGroup可以十分方便操作上传及下载文件,BackgroundDownloader和BackgroundUploader类中的方法 ...
- redhat6.4安装storm集群-4节点
0.搭建ftp服务器并建立yum源 1.在每个节点上安装java并设置环境变量 2.在三个节点上安装zookeeper 3.安装zeromq 过程中发现运行./configure时出现问题: conf ...
- android属性之excludeFromRecents -- clearTaskOnLaunch 隐身意图 启动activity
这个可以 用android 任务中app 隐藏起来 android属性之clearTaskOnLaunch 此属性是 每次启动app时都会进入 根目录中 android:clearTask ...
- kernel source reading notepad
__init ,标记内核启动时所用的初始化代码,内核启动完成后就不再使用.其所修饰的内容被放到.init.text section中 __exit,标记模块退出代码,对非模块无效 to be cont ...
- C# .net windows服务启动多个服务 ServiceBase
在windows服务中想要启动多个服务 ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { // new SyncServ ...
- 使用python-openCV对摄像头捕捉的镜头进行二值化并打上文字
用CaptureFromCAM函数对图像进行提取: capture = cv.CaptureFromCAM(0) 读取直接的视频文件只需将语句改变为: capture = cv.VideoCaptur ...
- 北大poj-1088
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 88484 Accepted: 33177 Description ...
- Android SnackBar使用方法
SnackBar是 Android Support Library 22.2.0 里面新增提供的一个控件,类似于Toast的使用 使用方法 Snackbar snackbar = Snackbar.m ...
- Tomcat 安装--小白教程
因为要进行微信公众号的开发模式,所以需要安装Tomcat Web服务器,现在就把我的安装过程写下来,希望可以帮到有需要的人~首先,我们需要下载tomcat的安装包,直接去官网就好啦,http://to ...
- 数论 UVA 11889
有关数论的题目,题目大意是给你两个数a和c,c为a和另一个数b的最小公倍数,要求你求出b的最小值.由最大公约数gcd(a,b)和最小公倍数lcm(a,b)之间的关系可知,lcm(a,b)*gcd(a, ...