给定一个整数数组,求它的一个最长递增子序列。
来源:互联网 发布: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 };}}
阅读全文
0 0
- 给定一个整数数组,求它的一个最长递增子序列。
- 求一个数组的最长严格递增子序列
- Java求给定数组的最长递增子序列
- 2.16 求一个数列的最长递增子序列
- 求一个整数数组最长递减子序列
- 求数组的最长递增子序列
- 求数组的最长递增子序列
- 【DP】计算一个数组的最长递增子序列
- 求整数数组中的最长递增子序列长度
- 求一个序列中的最长严格递增子序列。
- 求一个数组中递增不减最长子数组
- 给定一个数字序列,输出一个最长的子序列
- 求一个数组的最长递减子序列
- 求一个数组的最长递减子序列
- 求一个数组的最长递减子序列
- 求一个数组的最长递减子序列
- 求一个数组的最长递减子序列
- 求一个数组的最长递减子序列
- Android 接口返回Json解析
- Android开发之获取缓存大小和清除缓存
- jsp---用标签操作javaBean(动作标签BeanTest.jsp)
- Redis常见问题
- shader中的变量的声明与定义
- 给定一个整数数组,求它的一个最长递增子序列。
- Debug调试
- connectGatt()
- UTF8
- 第1章 Linux 简介(补充)
- iOS 整段代码注释
- AWS IoT 限制
- Google code jam
- Spring Tomcat Post Get 请求参数有中文时出现乱码或+号变空格等关于编码的问题