
思路: 贪心算法的代码并不难写,关键是难想,下面介绍,本题如何贪心及为什么可以贪心
为什么可以贪心
按数对第二个元素排序后,可以保证每步都是缓慢增加的 ,若第二个元素较大的排在前面,则一定会有可行结果被丢弃,因此可以贪心

Arrays.sort(pairs, (a , b) -> a[1] - b[1]);
int temp = pairs[0][1];
int ans = 1;
for(int i=1; i<pairs.length; i++){
if(pairs[i][0] > temp){
ans++;
temp = pairs[i][1];
}
}
return ans;
动态规划法思想: 将pairs按数对中第一个元素排序,定义一数组 dp[len],存储第i 个元素具有的最长满足题意数对长度, 每次循环, 遍历前 i 个元素, 找到第j 个数对中第二个数小于第 i 个数对中的第一个数, 更新 dp[i] 为 Math.max(dp[i], dp[j]+1)
int len = pairs.length;
int dp[] = new int[len];
Arrays.sort(pairs, (a, b) -> (a[0] - b[0]));
Arrays.fill(dp, 1);
for(int i=0; i<len; i++){
for(int j=0; j<i; j++){
if(pairs[i][0] > pairs[j][1]){
dp[i] = Math.max(dp[i], dp[j]+1);
}
}
}
return dp[len - 1];


public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> (a[0] - b[0]));
List<Integer> list = new ArrayList<>();
list.add(intervals[0][0]);
list.add(intervals[0][1]);
for(int i=1; i<intervals.length; i++){
if(intervals[i][0] > list.get(list.size() - 1)){
list.add(intervals[i][0]);
list.add(intervals[i][1]);
} else{
if(intervals[i][1] > list.get(list.size()-1)){
list.remove(list.size() - 1);
list.add(intervals[i][1]);
}
}
}
int ansLength = list.size()/2;
int[][] ans = new int[ansLength][2];
for(int i=0; i<ansLength; i++){
ans[i][0] = list.get(i*2);
ans[i][1] = list.get(i*2+1);
}
return ans;
}