给定一个整数数组,求它的一个最长递增子序列。

来源:互联网 发布:mac 解压 编辑:程序博客网 时间:2024/06/03 19:10

题目描述:如题。

样例:

    输入 :

    5

    1 5 2 3 6 9

    输出:

    1 2 3 6 9

分析:

    本题最好的解法是使用动态规划,首先要想明白一个问题:如何找到以a[n]作为最后一个元素的最长子列。

    要找到以a[n]作为最后一个元素的最长子列,我们需要找出数组中所有的a[n]之前并且比a[n]小的元素集合,设为S(a[s]), 设在S(a[s])中以元素a[s]为最后一个元素的子列为Ls(a[s]), 选择Ls(a[s])中最长的一个加上a[n]自身就得到了以a[n]元素为队尾的最长子列。

    要得到最终答案只需要再次遍历数组,比较所有以a[k](0 < k <= n)为队末的队列长度并选择最长的一个即可。


Java解答:

import java.util.Arrays;import java.util.List;import java.util.Scanner;import com.google.common.collect.Lists;public class LonggestSon {// 输出数组的最长有序子序列,(子序列不要求紧紧相连)// 如 1 4 2 3 6 9最长子序列为:1 2 3 6 9// 算法思路为动态规划,下一步选择建立在最优的上一步选择之上。public static void main(String[] args) {int[] array = new int[] {};try {array = LonggestSon.getScanArray();} catch (Exception e) {e.printStackTrace();}LonggestSon.getMaxLethSon(array);}public static int[] getScanArray() throws Exception {int[] result;Scanner scanner = new Scanner(System.in);int lenth = Integer.parseInt(scanner.nextLine());result = new int[lenth];String arryStr = scanner.nextLine();String[] arrays = arryStr.split(" ");if (arrays.length != lenth) {throw new Exception("length error");}for (int i = 0; i < lenth; i++) {result[i] = Integer.parseInt(arrays[i]);}return result;}public static int[] getMaxLethSon(int[] a) {int[] marks = new int[a.length];for (int i = 0; i < a.length; i++) {int currentMaxleth = 0;for (int j = 0; j < i; j++) {if (a[j] < a[i] && marks[j] > currentMaxleth) {currentMaxleth = marks[j];}}marks[i] = currentMaxleth + 1;}System.out.println("arrays:" + Arrays.toString(a));System.out.println("marks :" + Arrays.toString(marks));int maxleth = 0;int maxlethpos = 0;for (int i = 0; i < marks.length; i++) {if (marks[i] > maxleth) {maxleth = marks[i];maxlethpos = i;}}System.out.println("最长子序列长度 =" + maxleth);List<Integer> son = Lists.newArrayList();son.add(a[maxlethpos]);int currentleth = maxleth;for (int i = maxlethpos - 1; i >= 0; i--) {if (marks[i] == currentleth - 1) {currentleth--;son.add(a[i]);}}List<Integer> trueSon = Lists.reverse(son);System.out.println("最长子序列为:" + trueSon);return new int[] { 0 };}}


   

原创粉丝点击