Letcode雙指針題的Java實現(盛水容器和合並區間)

1.合併區間

打開合併區間題目

class Solution {
  public int[][] merge(int[][] intervals) {
        if(intervals.length < 2) return intervals;
        // 排序:根據區間起始值升序
        Arrays.sort(intervals, (o1,o2)->(o1[0]-o2[0]));
        List<int[]> list = new ArrayList<>();
        int[] lastInterval = null; //數組指針
        for (int[] interval : intervals) {
        //如果當前區間與上個區間不重合,區間如list,指針後移
            if(lastInterval == null || lastInterval[1] < interval[0]){
                lastInterval = interval;
                list.add(lastInterval);
            } //重合則判斷當前區間是否爲上一區間子集,如果不是就要更新右邊界
            else if(lastInterval[1] < interval[1]){
                lastInterval[1] = interval[1];
            }
        }
        return list.toArray(new int[0][]);
    }
}

2.盛最多水的容器

打開11. 盛最多水的容器題目
思路:盛水量 = 左右兩端中較短板高度 * 兩板距離。因此可定義 i 和 j 兩個指針分別指向數組的左右兩端,然後兩個指針向中間搜索。因爲水量取決於短板,每次都將較短板往中間移。

雙指針法:
class Solution {
     public int maxArea(int[] height) {
        int i = 0, j = height.length - 1, res = 0;
        while(i < j){  //每次更新面積最大值 res,直到 i == j 時返回 res。
            res = height[i] < height[j] ?    
                Math.max(res, (j - i) * height[i++]): 
                Math.max(res, (j - i) * height[j--]); 
        }
        return res;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章