题目
You are given
n
pairs of numbers. In every pair, the first number is always smaller than the second number.
Now, we define a pair (c, d)
can follow another pair (a, b)
if and only ifb < c
. Chain of pairs can be formed in this fashion.
Given a set of pairs, find the length longest chain which can be formed. You needn't use up all the given pairs. You can select pairs in any order.
Example 1:
Input: [[1,2], [2,3], [3,4]] Output: 2 Explanation: The longest chain is [1,2] -> [3,4]
Note:
- The number of given pairs will be in the range [1, 1000].
含义,给定一组数组对,类似于[[1,2], [2,3], [3,4]],如果一个数组元素的第一个数大于另一个元素的第二个数,那么就能构成一个链条,求问给定数组对中最长能组成的链条有几节,一个元素默认算一节
解题思路,这一道题是动态规划题,medium中较低难度的题。我的解题思路是首先将数组按照第一个数进行排序,这里用的是冒泡法,消耗时间会比较多。然后遍历数组,按照第二个数的大小来算的最简单的动态规划,代码如下。
package com;
public class Solution {
public static void main(String[] args) throws Exception{
int[][] pairs={{100,101},{2,3},{1,6},{4,8},{9,11},{7,15}};
System.out.println(findLongestChain(pairs));
}
public static int findLongestChain(int[][] pairs) {
int res=0;
for(int i=0;i<pairs.length;i++){
for(int j=0;j<pairs.length-1;j++)
{
int[] tmp=pairs[0];
if(pairs[j][0]>pairs[j+1][0])
{
tmp=pairs[j+1];
pairs[j+1]=pairs[j];
pairs[j]=tmp;
}
}
}
int first=pairs[0][0];
int sec=pairs[0][1];
res=1;
for(int i=1;i<pairs.length;i++){
if(pairs[i][1]<sec)
{
sec=pairs[i][1];
}
else if(pairs[i][0]>sec){
res++;
sec=pairs[i][1];
}
}
return res;
}
}