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;
}
}