2020-08-23刷题

  1. leetcode1143-最长公共子序列
    题型:动态规划
    难度:中等(出现频率很大)
    题目:给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
    例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。
    代码:
//用两个人指针标记,两个字符串当前指向的字符,判断是否相等
//如果相等,当前两个字符为止,组成的最大个数,即两个字符串前面的最大数+1
//如果不相等,将一个字符串前面,选择最大值。
class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        if(text1.size()==0 || text2.size()==0) return 0;
        vector<vector<int> > dp(text1.size()+1,vector<int>(text2.size()+1,0));
        for(int i=1;i<=text1.size();i++)
        {
            for(int j=1;j<=text2.size();j++)
            {
                if(text1[i-1] == text2[j-1])
                {
                    dp[i][j] = dp[i-1][j-1]+1;
                }
                else
                {
                    dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        return dp[text1.size()][text2.size()];
    }
};
  1. leetcode368-最大整除子集
    题型:动态规划
    难度:中等
    题目:给出一个由无重复的正整数组成的集合,找出其中最大的整除子集,子集中任意一对 (Si,Sj) 都要满足:Si % Sj = 0 或 Sj % Si = 0。
    如果有多个目标子集,返回其中任何一个均可。
    代码:
//动态规划问题。现将原数组排序,分别以每个元素作为数组最大值,分别去看比他小的元素。
//用当前最大值和前面的元素一一取余,满足条件,则在小元素当前基础上加1,并且记录最大值的最大序列中,元素更新的最新位置。
//很重要的一点:最后得到的最大值位置中,先把最大值取出,下一个要取的值,就是最大值对应的前面的最大值。
class Solution {
public:
    vector<int> largestDivisibleSubset(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin(),nums.end());
        vector<int> dp(n,1);//记录当前元素为最大值时,最大子集个数
        vector<int> lastvec(n,-1);//上一次更新的值的位置
        int nMax = 0;
        int index = -1;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<i;j++)
            {
                if(nums[i]%nums[j] == 0 && dp[i]<=dp[j])//刚开始没有写第二个条件,会导致把大值替换掉,注意。
                {
                    dp[i] = dp[j]+1;
                    lastvec[i] = j;
                }
            }
            if(nMax < dp[i])
            {
                index = i;
                nMax = dp[i];
            }
        }
        //从后往前遍历,通过后面的元素,依次找到前面的
        vector<int> res;
        for(int i=index;i>=0;i=lastvec[i])
        {
            res.insert(res.begin(),nums[i]);
        }
        return res;
    }
};

//借鉴评论区大佬的解法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值