美文网首页
2020-11-13--数据结构与算法-15(动态规划篇4)

2020-11-13--数据结构与算法-15(动态规划篇4)

作者: 冰菓_ | 来源:发表于2020-11-20 11:18 被阅读0次

1.最长上升子序列

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class LengthOfLIS {
    /**
     * Created with IntelliJ IDEA.
     * Description:
     * User:
     * Date: 2020-11-12
     * Time: 21:26
     */
    public static void main(String[] args) {
        ArrayList<Integer> inte = new ArrayList<Integer>();
        inte.add(1);
        inte.add(2);
        inte.add(3);
        inte.add(4);
        inte.add(5);
        inte.add(6);
        inte.add(8);
        inte.forEach(System.out::println);
        //(-(插入点) - 1)。插入点 被定义为将键插入列表的那一点:即第一个大于此键的元素索引
        System.out.println(Collections.binarySearch(inte, 7));


    }

    public static int lengthOfLIS(int[] nums) {
        //首先边界条件的确定
        if (nums.length <= 0) {
            return 0;
        }
        //考虑就一个数组用来存放状态值,对数组的余地,dp[i] = number 第多少个数的最长上升子序列
        int[] dp = new int[nums.length];
        //考虑最小的长度为一,初始化数组
        Arrays.fill(dp, 1);
        //怎么确定转移方程,既是我们知道dp[i-1] 怎么求dp[i]
        //我们只要找到前面的子问题中最后一位比dp[i]小的最大子问题即可+1
        //使用一个循环求取所有的状态
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < i; j++) {
                //这里的判断是求取的关键
                if (nums[i] > nums[j]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
        }

        //数组中最大的状态就是最长的最长上升子序列
        int tmp = 0;
        for (int i = 0; i < nums.length; i++) {
            tmp = Math.max(dp[i], tmp);
        }
        return tmp;
    }

    public static int lengthOfLIS1(int[] nums) {
        //使用二分查找
        //思路建立一个集合,首先存储第一次的数,以及如果某前面的数小于后面的数直接添加到集合中
        List<Integer> list = new ArrayList<>(nums.length);

        for (int num : nums) {
            //集合的长度为0的时候或者前面的数小于后面的数就添加到集合中
            if (list.size() == 0 || list.get(list.size() - 1) < num) {
                list.add(num);
            } else {
                //二分法 binarySearch返回值是第一个大于它的索引
                // (-(插入点) - 1)。插入点 被定义为将键插入列表的那一点:即第一个大于此键的元素索引
                int i = Collections.binarySearch(list, num);
                //如果i>0 说明本来就存在直接替换即可 ,如果小于取反减去1
                list.set((i < 0) ? -i-1 : i , num);
                 //下面的这种写法通过不了
               // list.set((i > 0) ? i : -i - 1, num);
            }
        }

        return list.size();
    }
}

相关文章

  • 2020-11-13--数据结构与算法-15(动态规划篇4)

    1.最长上升子序列

  • 动态规划-js

    动态规划 参考:算法分析与设计-贪心&动归 漫画:什么是动态规划? 【数据结构与算法】 DP 动态规划 介绍 介绍...

  • 4. 动态规划算法

    1. 动态规划算法总结2. 漫画:什么是动态规划?3.算法之动态规划4. 动态规划-算法

  • 一位算法工程师的自我修养

    数据结构与算法 基本算法思想动态规划贪心算法回溯算法分治算法枚举算法 算法基础 时间复杂度 空间复杂度 最大复杂度...

  • 算法与数据结构网址备忘

    kd-tree算法原理与开源代码实现 详解kd-tree 动态规划入门篇 动态规划进阶篇

  • 七、动态规划

    记录一下对动态规划的学习。在学习数据结构与算法的过程中,觉得比较难的一个算法思想就是动态规划了。它的应用实在是多,...

  • 数据结构与算法-目录

    数据结构与算法-目录 C语言篇 数据结构和算法-C语言篇1-绪论数据结构和算法-C语言篇2-初识算法数据结构与算法...

  • 动态规划 Dynamic Programming

    从运筹学和算法的角度综合介绍动态规划 算法分类总结动态规划与静态规划的关系浅析静态规划和动态规划动态规划解非线性规...

  • 算法草稿

    常用算法集合 字符处理算法数组与查找链表树算法思路 递归、动态规划、BFS/DFS、双指针、二分法搜索数据结构的...

  • Swift 算法实战:动态规划

    Swift 算法实战:动态规划 Swift 算法实战:动态规划

网友评论

      本文标题:2020-11-13--数据结构与算法-15(动态规划篇4)

      本文链接:https://www.haomeiwen.com/subject/ftqmbktx.html