leetcode 第190场周赛

检查单词是否为句中其他单词的前缀定长子串中元音的最大数目二叉树中的伪回文路径两个子序列的最大点积
3分 简单4分 中等5分 中等6分 困难

1455 数组中两元素的最大乘积

解题思路:

以空格分割字符串,seartchword跟每个字符串作比较,匹配了直接返回

index记录现在是第几个字符串

复杂度:

遍历了字符串sentence一遍,故为O(n)

class Solution {
public:
    int isPrefixOfWord(string sentence, string searchWord) {
        int len=sentence.length();
        int index=1,now=0;
        int n=searchWord.length();
        for(int i=0;i<len;i++){
            
            while(sentence[i]!=' '&&i<len){
                if(sentence[i]==searchWord[now]){
                    now++;
                    if(now==n) return index;
                }
                else{
                    while(sentence[i]!=' '&&i<len) i++;
                    break;
                }
                i++;
            }
            now=0;
            index++;
        }
        return -1;
    }
};

1456 定长子串中元音的最大数目

解题思路:

维护长度为k的滑动窗口即可,now记录当前滑动窗口的元音数,每次更新最大值ans

复杂度:

O(n)

class Solution {
public:
    int a[26];
    int maxVowels(string s, int k) {
        int n=s.length();
        string tmp="aeiou";
        for(auto it:tmp) a[it-'a']=1;    
        int ans=0,now=0;
        for(int i=0;i<k;i++){
            if(a[s[i]-'a']){
                now++;
            }
        }
        ans=max(ans,now);
        for(int i=k;i<n;i++){
            if(a[s[i]-'a']){
                now++;
            }
            if(a[s[i-k]-'a']){
                now--;
            }
            ans=max(ans,now);
        }
        return ans;
    }
};

 


1457 二叉树中的伪回文路径

解题思路:

题意是让你求从根节点到叶子节点的伪回文路径数目,伪回文路径表示这条路径经过的节点重新排序后可以形成一个回文序列

那么,题意就转化为了这条路径中个数为奇数的值是否小于1,小于1的话可以构成回文序列

dfs遍历即可,还要维护1-9的值的个数(vector<int>num)

class Solution {
public:
    int ans=0;
    void dfs(TreeNode* root,vector<int>num){
        num[root->val]++;
        if(root->left==NULL&&root->right==NULL){
            int odd=0,even=0;
            for(auto it:num){
                if(it&1) odd++;
                else even++;
            }
            if(odd<=1){
                ans++;
            } 
            return ;
        }
        
        if(root->left!=NULL) dfs(root->left,num);
        if(root->right!=NULL) dfs(root->right,num);
    }
    int pseudoPalindromicPaths (TreeNode* root) {
        if(root==NULL) return 0;
        vector<int>num(10,0);
        ans=0;
        dfs(root,num);
        return ans;
    }
};

 


1458 两个子序列的最大点积

解题思路:

dp

dp[i][j]表示nums1中前i个,nums2中前j个中非空子序列的最大点积
转移方程
dp[i][j]=max(dp[i-1][j],max(0,dp[i-1][j-1])+nums1[i-1]*nums2[j-1]);
如果选了nums1[i-1],nums2[j-1]作为最新的非空子序列的下一个点积,肯定要选择之前的最大点积状态
dp[i-1][j-1],或者0(之前的最大点积状态值为负,可以都不选)
    
dp[i][j]=max(dp[i][j],dp[i][j-1]);
表示nums[i]和nums[jj]点积更大(jj<j)
    
另外要把其他状态赋值为最小值,因为子序列是非空的,如果最大点积仍然小于0,若不赋为最小值,答案可能为0,不符合条件

复杂度:

O(n*m)

class Solution {
public:
    int dp[505][505];
    int maxDotProduct(vector<int>& nums1, vector<int>& nums2) {
        int n=nums1.size();
        int m=nums2.size();
        for(int i=0;i<=m;i++) dp[0][i]=-1000000000;
        for(int i=1;i<=n;i++){
            dp[i][0]=-1000000000;
            for(int j=1;j<=m;j++){
                dp[i][j]=max(dp[i-1][j],max(0,dp[i-1][j-1])+nums1[i-1]*nums2[j-1]);
                dp[i][j]=max(dp[i][j],dp[i][j-1]);
            }
        }
        return dp[n][m];
    }
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值