系列博客目录
228.汇总区间
链接
自己的思路:先排序,然后设置number来知道连续的子区间有几个数字方便后续处理。
如果当前数字和前面数字不连续,就把前面数字根据number做处理。
class Solution {
public List<String> summaryRanges(int[] nums) {
List<String> strings = new ArrayList<>();
if(nums ==null || nums.length==0) return strings;
Arrays.sort(nums);
int number = 1;
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(nums[0]);
for (int i = 1; i < nums.length; i++) {
if(nums[i] - nums[i - 1] != 1 && number == 1){
strings.add(stringBuffer.toString());
stringBuffer.delete(0,stringBuffer.length());
stringBuffer.append(nums[i]);
}else if(nums[i] - nums[i - 1] != 1 && number != 1) {
stringBuffer.append("->");
stringBuffer.append(nums[i-1]);
strings.add(stringBuffer.toString());
stringBuffer.delete(0,stringBuffer.length());
stringBuffer.append(nums[i]);
number = 1;
}else {
number ++;
}
}
if(number != 1){
stringBuffer.append("->");
stringBuffer.append(nums[nums.length-1]);
strings.add(stringBuffer.toString());
}else {
strings.add(stringBuffer.toString());
}
return strings;
}
}
class Solution {
public List<String> summaryRanges(int[] nums) {
List<String> ret = new ArrayList<String>();
int i = 0;
int n = nums.length;
while (i < n) {
int low = i;
i++;
while (i < n && nums[i] == nums[i - 1] + 1) {
i++;
}
int high = i - 1;
StringBuffer temp = new StringBuffer(Integer.toString(nums[low]));
if (low < high) {
temp.append("->");
temp.append(Integer.toString(nums[high]));
}
ret.add(temp.toString());
}
return ret;
}
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/summary-ranges/solutions/553645/hui-zong-qu-jian-by-leetcode-solution-6zrs/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
56 合并区间
思路:
首先进行排序
可以合并的两个窗口 ,他们之中的后者的窗口左边界必然会小于等于之前窗口的最右边界
我们只要不断的判断当前窗口的左边界是否之前大于窗口的右边界
- 大于,则需要将之前的记录保存,然后创建一个新的窗口记录。
- 小于等于,则和之前的窗口进行合并,并尝试更新右边界
class Solution {
public int[][] merge(int[][] intervals) {
for (int i = 0; i < intervals.length; i++) {
for (int i1 = 1; i1 < intervals.length - i; i1++) {
if(intervals[i1][0]<intervals[i1-1][0]){
int[] buffer = intervals[i1];
intervals[i1] = intervals[i1-1];
intervals[i1-1] = buffer;
}
}
}
//以上代码可以简化为Arrays.sort(intervals,Comparator.comparingInt(o -> o[0]));
List<int[]> list = new ArrayList<>();
for (int i = 0; i < intervals.length; i++) {
if(i< intervals.length-1 && intervals[i][1]>=intervals[i+1][0]){
intervals[i+1][1] = Math.max(intervals[i][1],intervals[i+1][1]);
intervals[i+1][0] = intervals[i][0];
}else{
list.add(new int[]{intervals[i][0], intervals[i][1]});
}
}
return list.toArray(new int[0][]);
}
}
57.插入区间
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
int left = newInterval[0];
int right = newInterval[1];
boolean placed = false;//表示是否已经放入
List<int[]> ansList = new ArrayList<int[]>();
for (int[] interval : intervals) {
if (interval[0] > right) {
// 在插入区间的右侧且无交集
if (!placed) {
ansList.add(new int[]{left, right});
placed = true;
}
ansList.add(interval);
} else if (interval[1] < left) {
// 在插入区间的左侧且无交集
ansList.add(interval);
} else {
// 与插入区间有交集,计算它们的并集
left = Math.min(left, interval[0]);
right = Math.max(right, interval[1]);
}
}
if (!placed) {
ansList.add(new int[]{left, right});
}
return list.toArray(new int[0][]);
}
}
452.用最少数量的箭引爆气球
class Solution {
public int findMinArrowShots(int[][] points) {
if(points.length == 0) return 0;
Arrays.sort(points,new Comparator<int[]>(){
public int compare(int[] point1, int[] point2){
if(point1[1]> point2[1]){
return 1;
}else if(point1[1]<point2[1]){
return -1;
}else {
return 0;
}
}
});
int ans = 1;
int pos = points[0][1];
for(int[] point : points){
if(point[0] > pos){
ans ++;
pos = point[1];
}
}
return ans;
}
}