題目連接ide
題目大意:一個circle圓環,第i個位置,有汽油gas[i],而汽車從i到i+1,須要汽油cost[i]。求解,從哪一個位置開始,汽車能走完圓環。若是走不完則返回-1,能走完則返回index。例子以下:spa
法一:兩個for循環。直接求解每一個可能的起始位置,而後計算可否在有汽油的狀況下,走徹底環。o(n^2)。超時了。代碼以下:code
1 public int canComplete(int[] gas, int[] cost) { 2 int len = gas.length; 3 int cnt = 0; 4 int flag = 0; 5 //逐一遍歷每一種可能 6 for(int i = 0; i < len; i++) { 7 flag = 0; 8 //對於每個可能起始點,都計算一下circle可否完成汽車行駛任務 9 for(int j = i; j < len; j++) { 10 cnt += gas[j] - cost[j]; 11 if(cnt < 0 ) { 12 cnt = 0; 13 flag = -1; 14 break; 15 } 16 } 17 if(flag == -1) { 18 continue; 19 } 20 for(int j = 0; j < i; j++) { 21 cnt += gas[j] - cost[j]; 22 if(cnt < 0) { 23 cnt = 0; 24 flag = -1; 25 break; 26 } 27 } 28 if(flag == 0) { 29 return i; 30 } 31 } 32 return -1; 33 }
法二(借鑑):貪心。待證實。具體見代碼(耗時1ms):blog
1 public int canComplete(int[] gas, int[] cost) { 2 int gas_cnt = 0, cost_cnt = 0; 3 int index = 0, cnt = 0; 4 for(int i = 0; i < gas.length; i++) { 5 //統計全部汽油數量 6 gas_cnt += gas[i]; 7 //統計汽車行駛花費的全部汽油數量 8 cost_cnt += cost[i]; 9 //統計到目前爲止,汽油數量可否支撐汽車行駛 10 cnt += gas[i] - cost[i]; 11 //若是一旦行駛不了,則從當前位置的下一個位置做爲起始點 12 //緣由:因爲到如今都行駛不了,若是選擇這個位置以前的任何一個位置做爲起始點,汽油數量只會更少 13 //因爲若是汽油數量>=花費數量,則必定存在解,因此所找到的解必定符合要求。 14 if(cnt < 0) { 15 cnt = 0; 16 index = i + 1; 17 } 18 } 19 //若是汽油數量<花費數量,則必定不存在解。 20 if(gas_cnt < cost_cnt) { 21 return -1; 22 } 23 return index; 24 }