贪心算法本质
一句话概括就是局部最优
最经典的例子就是冒泡排序:
我总是希望选中“最大的值”沉入到数组的底部
每一次,就是一个局部最优的过程
for(int i =0;i<arrs.length;i++){
int select = arrs[i];
for(int j = i+1;j<arrs.length;j++){
//局部最优
if(arrs[j]<select){
//交换
}
}
}
ok,现在来看原题
这里的贪心在哪呢,我总是希望每一次加油和消耗剩余的值大于0,从而保证我能往下继续跑。
这就是贪心,还是比较容易满足的:
public int canCompleteCircuit (int[] gas, int[] cost) {
// write code here
int rest = 0;
for(int i =0;i<gas.length;i++){
boolean arrive = true;
//设定起点为i
//
for(int j =0;j<gas.length;j++){
//获取站点
int station = getCicle(gas.length,i+j);
//开始贪心
rest += gas[station] - cost[station];
if(rest<0){
arrive = false;
rest = 0;
break;
}
}
if(arrive){
return i;
}
}
return -1;
}
//将123...n映射到123的轮询
//比如输入4->输出1
//输入5->2
//6->3
//7->1...
public int getCicle(int size,int pos){
return pos%size;
}
今日份(6/10)