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