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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章