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 ...
随机推荐
- 手机抓包-fiddler
如果app走的是http协议,不用root,只需要通过fiddler做代理,就可以抓到所有请求. 1. fiddler+手机wifi设置 安装fiddler,勾中 Fiddler Options -& ...
- linux命令每日一练习-top free
top看看进程的内存使用情况 free产看内存使用情况 top -n 2 -b > log.txt 将更新两次的结果输入到log.txt cat > log.txt //清空文件并写入 ...
- 4、android BroadcastReceiver详细用法
BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播. 在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这 ...
- Hadoop学习资料
转自:http://cloud21.iteye.com/blog/607175 第一手资源 hadoop官方网站 hadoop.apache.org 最权威的官方资源之一 dev.yahoo.hado ...
- javascript高级教程:如何优化javascript代码性能
在web前端开发中,为实现一些动态效果,减小页面大小,我们一般都会使用JavaScript技术来进行相关设置.但是初学者在编写JavaScript代码的时候,往往都是比较低质的代码,那如何才能提高Ja ...
- 日常笔记 ---- 图形学-Frenel函数材质球实现方式
图形学-Frenel函数材质球实现方式 调个材质 大概公式 自发光= 自定义边光颜色* ((1-法线与视角方向点乘)的 自定义幂次方 ) 这个是比较简单方法 模型的法线与视角方向 角度越大 表 ...
- HDU 4576 简单概率 + 滚动数组DP(大坑)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4576 坑大发了,居然加 % 也会超时: #include <cstdio> #includ ...
- 鼠标点击页面任意标签,alert该标签名称(考虑兼容性)
<script type="text/JavaScript"> document.onclick=function(e){ e=e||window.event; ...
- 自定义EditText实现可以一键删除输入的内容
public class MyEditText extends EditText { private Drawable dRight; private Rect rRounds; public MyE ...
- Opencv创建有滚动条的视频
#include "stdafx.h"#include "cv.h"#include "cxcore.h"#include "hi ...