首页 > 其他分享 >力扣——6.动态规划

力扣——6.动态规划

时间:2023-04-22 14:00:22浏览次数:51  
标签:numsSize nums int len 力扣 sizeof 动态 规划 dp

title: 动态规划

6、最长上升子序列

(1)采用动态规划,算法复杂度为O(n*n)

int lengthOfLIS(int* nums, int numsSize){
    int i, j, max=1;
    if(NULL==nums || 0==numsSize){
        return 0;
    }
    int *dp = (int*)malloc(numsSize*sizeof(int));
    memset(dp, 0, numsSize*sizeof(int));
    for(i=0; i<numsSize; ++i)
    {
        dp[i] = 1;
        for(j=0; j<i; ++j)
        {
            if(nums[j]<nums[i] && dp[i]<=dp[j]){
                dp[i] = dp[j]+1;
            }
            if(dp[i] > max){
                max = dp[i];
            }
        }
    }
    return max;
}

(2)贪心+二分查找,时间复杂度是O(n*log n)

注意理解 :如果我们要使上升子序列尽可能的长,则我们需要让序列上升得尽可能慢,因此我们希望每次在上升子序列最后加上的那个数尽可能的小。(贪心)

int lengthOfLIS(int* nums, int numsSize){
    if(NULL==nums || 0==numsSize){
        return 0;
    }

    int len = 1, i;
    int *dp = (int*)malloc((numsSize+1)*sizeof(int));
    memset(dp, 0, (numsSize+1)*sizeof(int));
    dp[len] = nums[0];   
    for(i=1; i<numsSize; ++i)
    {
        if(nums[i] > dp[len]){
            dp[++len] = nums[i];
        } else{
            int left = 1, right = len, pos = 0;
            while(left <= right)
            {
                int mid = (left+right)>>1;
                if(dp[mid] < nums[i]){
                    pos = mid;
                    left = mid+1;
                } else{
                    right = mid-1;
                }
            }
            dp[pos+1] = nums[i]; 
        }
    }
    return len;
}

参考链接:http://cnblogs.com/BlairGrowing/p/12747603.html

标签:numsSize,nums,int,len,力扣,sizeof,动态,规划,dp
From: https://www.cnblogs.com/blue-Suri/p/17342962.html

相关文章

  • 力扣——21.合并两个有序链表(c语言)
    title:力扣——21.合并两个有序链表(c语言)将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4,1->3->4输出:1->1->2->3->4->41、递归实现:/***Definitionforsingly-linkedlist.*structListNode{......
  • 力扣——83.删除排序链表中的重复元素(c语言)
    title:力扣——83.删除排序链表中的重复元素(c语言)题目描述:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例1:输入:1->1->2输出:1->2示例2:输入:1->1->2->3->3输出:1->2->3代码如下:/***Definitionforsingly-linkedlist.*structListNode{*......
  • 力扣——121.买卖股票的最佳时机(C语言)
    title:力扣——121.买卖股票的最佳时机(C语言)题目描述:给定一个数组,它的第i个元素是一支给定股票第i天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例1:输入:[7,1,5,3,6,......
  • 力扣——193.有效电话号码(shell)
    title:力扣——193.有效电话号码(shell)给定一个包含电话号码列表(一行一个电话号码)的文本文件file.txt,写一个bash脚本输出所有有效的电话号码。你可以假设一个有效的电话号码必须满足以下两种格式:(xxx)xxx-xxxx或xxx-xxx-xxxx。(x表示一个数字)你也可以假设每行前后没有......
  • 力扣——192.统计词频(shell)
    title:力扣——192.统计词频(shell)题目描述:写一个bash脚本以统计一个文本文件words.txt中每个单词出现的频率。为了简单起见,你可以假设:words.txt只包括小写字母和''。每个单词只由小写字母组成。单词间由一个或多个空格字符分隔。示例:假设words.txt内容如下:th......
  • 力扣——195.第十行(shell)
    title:力扣——195.第十行(shell)给定一个文本文件file.txt,请只打印这个文件中的第十行。示例:假设file.txt有如下内容:Line1Line2Line3Line4Line5Line6Line7Line8Line9Line10你的脚本应当显示第十行:Line10方法1:awk'NR==10'file.txt方法2:tai......
  • 力扣——240.搜索二维数组II(c语言)
    title:力扣——240.搜索二维数组II(c语言)同《剑指offer》04题目描述:编写一个高效的算法来搜索mxn矩阵matrix中的一个目标值target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例1:输入:matrix=[[1,4,7,11,15],[2,5,8,12,19],......
  • 力扣——5.最长回文子串(c语言)
    题目描述:给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为1000。示例1:输入:"babad"输出:"bab"注意:"aba"也是一个有效答案。示例2:输入:"cbbd"输出:"bb"1、思路1:动态规划对于一个子串而言,如果它是回文子串,并且长度大于2,那么将它首尾两个字......
  • 基于ACO蚁群优化的世界旅行路线规划matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要蚁群算法是通过对自然界中真实蚂蚁的集体行为的观察,模拟而得到一种仿生优化算法,它具有很好的并行性,分布性.根据蚂蚁群体不同的集体行为特征,蚁群算法可分为受蚂蚁觅食行为启发的模型和受孵化分类启发的模型,受......
  • threejs_动态heatmap渲染
    heatmap>heatmap2d.tsimport{Mesh,Texture,MeshBasicMaterial,PlaneGeometry,Box3,Vector3,}from'three';importBasefrom'../Base';importHeatMap,{DataPoint}from'heatmap-ts';import{log}from......