第一题:134. 加油站
- 题目说明
![](https://img-blog.csdnimg.cn/fcab98c4adfe45af8aadf9df7d8c3e5a.png#pic_center)
- 求解思路
1)初始位置加的油要大于消耗的油
2)如果最终加的油总和大于消耗油总和,那么一定存在某个出发点满足要求 - 求解步骤
1)首先进行遍历,寻找总的获得与消耗的差值(为了后面判断是否存在唯一的出发点)
2)在遍历上者时,对初始位置进行获得与消耗的积累,如果存在小于0,那么初始位置应该从下一个开始。(即通过排除法找到正确的位置,前提是正确位置存在)
3)输出:如果正确位置存在,输出满足条件的start,如果不存在,输出为-1 - 代码展示
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int start=0;
int runsum=0;
int totalsum=0;
for(int i=0;i<gas.length;i++){
runsum+=gas[i]-cost[i];
totalsum+=gas[i]-cost[i];
if(runsum<0){
start=i+1;
runsum=0;
}
}
return (totalsum>=0)?start:-1;
}
}
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int start;
for(start=gas.length-1;start>=0;start--){
int sumgas=0;
int sumcost=0;
if(gas[start]<cost[start]) {
continue;
}
for(int i=start;i<gas.length+start;i++){
sumgas+=gas[i%gas.length];
sumcost+=cost[i%gas.length];
if(sumgas<sumcost){
break;
}
}
if(sumgas<sumcost) continue;
return start;
}
return -1;
}
}
- 补充说明
1)也可以通过暴力进行求解,但是时间复杂度为O(n2),不一定能满足要求。
2)这种问题像脑筋急转弯,要找到满足条件的东西。
第二题:135. 分发糖果
第三题:860.柠檬水找零
- 题目说明
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MG34tfZY-
![](https://img-blog.csdnimg.cn/d877cbde7b5644f6bb5643881d75d98c.png#pic_center)
- 求解思路
根据题目要求,收上来的钱只能是5,10,20,故可以针对每一次收取与找零情况,进行判断。 - 求解步骤
1)遍历收取上来的钱
2)如果是5元,则five++; 如果是10元,则five–,ten++ ;如果是20元(优先five–,ten–,没有十元的,则five=five-3)
3)每次找零之后判断手上钱是否都是正数,是负数则直接输出false,全部为正数,则输出true. - 代码展示
class Solution {
public boolean lemonadeChange(int[] bills) {
int num=0;
int ling=0;
for(int i=0;i<bills.length;i++){
ling=bills[i]-5;
if(ling==0)num++;
for(int j=i-1;j>=0;j--){
if(bills[j]!=-1 && ling>=bills[j]){
ling-=bills[j];
bills[j]=-1;
}
if(ling==0){
num++;
break;
}
}
if(ling>0) return false;
}
return true;
}
}
class Solution {
public boolean lemonadeChange(int[] bills) {
int num=0;
int ling=0;
for(int i=0;i<bills.length;i++){
Arrays.sort()
ling=bills[i]-5;
if(ling==0)num++;
for(int j=i-1;j>=0;j--){
if(bills[j]!=-1 && ling>=bills[j]){
ling-=bills[j];
bills[j]=-1;
}
if(ling==0){
num++;
break;
}
}
if(ling>0) return false;
}
return true;
}
}
- 补充说明
1)这道题变简单,因为收上来的钱种类是固定的。
2)如果手上来的钱不是固定的,那么每次就需要优先把大钱找出去,
3)这里就需要每次手上来的钱,需要进行一个排序,优先把大钱找出去,手上保留小钱。
第四题:406.根据身高重建队列
- 题目说明
![](https://img-blog.csdnimg.cn/9f58789251164b64b624be97eb727da5.png#pic_center)
- 求解步骤
1)先重写数组的排序方法:先按第一个数的大小进行 - 代码展示
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people, (a,b) ->{
if(a[0]==b[0]) return a[1]-b[1];
return b[0]-a[0];
});
List<int[]> list=new ArrayList<>();
for(int i=0;i<people.length;i++){
list.add(people[i][1],people[i]);
}
return list.toArray(new int[people.length][2]);
}
}
- 补充说明
1)第一处:就是对Arrays.sort()方法比较器部分的重写:先按第一个进行排倒序,如果第一个相等,则按第二个数排升序。
2)在集合转为数组的时候,使用list.toArray(),括号里面新建一个所需的空数组。
3)数组转变为集合:遍历方法,一次add添加。