● 435. 无重叠区间
class Solution { public int eraseOverlapIntervals(int[][] intervals) { Arrays.sort(intervals,(a,b)->{ return Integer.compare(a[0],b[0]); }); int remove = 0; int pre = intervals[0][1]; for(int i = 1;i<intervals.length;i++){ if(intervals[i][0]<pre){ remove++; pre = Math.min(intervals[i][1],pre); //我们不需要去改变intervals的长度了,只需要遍历就行 } else{ pre = intervals[i][1]; } } return remove; } }
● 763.划分字母区间
class Solution { public List<Integer> partitionLabels(String s) { List<Integer> list = new LinkedList<>(); int[] edge = new int[26]; //对二十六个字母进行一个区间的划分 char[] chars = s.toCharArray(); for(int i = 0;i<s.length();i++){ edge[chars[i]-'a'] = i;//统计每个字母出现的最大位置 }//虽然看上去有些迟钝 //但目的是达到了的 int curRange = 0; int pre = -1;//第一个字符是属于1这个位置 for(int i = 0;i<s.length();i++){ curRange = Math.max(edge[chars[i]-'a'],curRange); //代表i这个位置上的字母的最大距离 //接着在[i,curRange]范围之内我们还会不断遍历,看是否还会有更大的值出现 if(i==curRange){ list.add(curRange-pre); pre = i; } } return list; } }
class Solution { public List<Integer> partitionLabels(String s) { List<Integer> list = new ArrayList<>(); int[] edge = new int[26]; char[] chars = s.toCharArray(); for(int i = 0;i<s.length();i++){ edge[chars[i] - 'a'] = i; } int offset = -1; int curRange = 0; for(int i =0;i<s.length();i++){ curRange = Math.max(curRange,edge[chars[i] - 'a']); if(i == curRange){ list.add(curRange - offset); offset= curRange; } } return list; } }
● 56 合并区间
class Solution { public int[][] merge(int[][] intervals) { LinkedList<int[]> res = new LinkedList<>(); Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0])); res.add(intervals[0]); for(int i = 1;i<intervals.length;i++){ if(res.getLast()[1]>=intervals[i][0]){ int start = res.getLast()[0]; int end = Math.max(res.getLast()[1],intervals[i][1]); res.removeLast(); res.add(new int[]{start,end}); } else{ res.add(intervals[i]); } } return res.toArray(new int[res.size()][]); } }