134.加油站
如下圖所示:
當索引一道2的時候,剩余油量的總量=1+3-6 < 0,這個時候說明以索引0為起點不合適,將起點更新為索引3.
兩點證明:
1.如果我們從藍色段中間選一個點開始,是不是最后sumGas就不小于0?
不會,我們可以看如下圖,如果藍色sumGas<0,sumGas1>0==>可以推出sumGas2<0,這樣就不符合我們在藍色段結束才sumGas<0的條件。
2.最終所有的剩余油量相加大于等于0就一定可以跑完一圈嗎?
一定會,可以這樣想:
這個圖畫成一個環形圖,前進方向為順時針。假設totalsum=0,那么走一圈油量和消耗抵消下來就為0(先不管油夠不夠走到每一站),假設從起點到第i點油量不夠消耗,那么從i點繼續走回起點油量就肯定大于消耗,因為總油量和消耗相等。那么答案很明顯了,我既然從起點順時針走到i點又不夠,那我從i點順時針走回起點油就夠了。
406.根據身高重建隊列
這道題目分為兩步:
1.將數組中的元素按照身高降序排列,如果身高相同,按照前面的人數升序排列
2.將每一個元素按照前面的人數插入對應的位置
第一步滿足了所有元素使降序排列,當元素往前面插入的時候不會影響其他元素滿足前面的人數的條件。
class Solution {public int[][] reconstructQueue(int[][] people) {// 身高從大到小排(身高相同k小的站前面)Arrays.sort(people, (a, b) -> {if (a[0] == b[0]) return a[1] - b[1]; // a - b 是升序排列,故在a[0] == b[0]的狀況下,會根據k值升序排列return b[0] - a[0]; //b - a 是降序排列,在a[0] != b[0],的狀況會根據h值降序排列});LinkedList<int[]> que = new LinkedList<>();for (int[] p : people) {que.add(p[1],p); //Linkedlist.add(index, value),會將value插入到指定index裡。}return que.toArray(new int[people.length][]);}
}
135. 分發糖果
思路:數組從左向右遍歷一遍,如果右大于左,置為加一
再從右向左遍歷一遍,如果左大于右,置為加一
class Solution {public int candy(int[] ratings) {//思路:數組從左向右遍歷一遍,如果右大于左,置為加一//再從右向左遍歷一遍,如果左大于右,置為加一int len = ratings.length;int[] candyArr = new int[len];candyArr[0] = 1;//從左向右for(int i = 1;i < len;i++){if(ratings[i-1] < ratings[i]){candyArr[i] = candyArr[i-1] + 1;}else{candyArr[i] = 1;}}//從右向左for(int i = len-2;i >= 0;i--){if(ratings[i] > ratings[i+1]){candyArr[i] = Math.max(candyArr[i],candyArr[i+1]+1); //必須保證既比右邊大又比左邊大}}int totalNum = 0;for(int n:candyArr){totalNum += n;}return totalNum;}
}