LeetCode双周赛10

Leetcode双周赛10

5079.三个有序数组的交集

给出三个均为 严格递增排列 的整数数组 arr1,arr2 和 arr3。

返回一个由 仅 在这三个数组中 同时出现 的整数所构成的有序数组。

示例:

输入: arr1 = [1,2,3,4,5], arr2 = [1,2,5,7,9], arr3 = [1,3,4,5,8]
输出: [1,5]
解释: 只有 1 和 5 同时在这三个数组中出现.

提示:

1 <= arr1.length, arr2.length, arr3.length <= 1000
1 <= arr1[i], arr2[i], arr3[i] <= 200

数据范围只有1000,直接暴力的O(n^3)匹配。当然也可以用二分查找将复杂度降到O(n(logn)^2),不过没有必要。

int tmp[1005];
class Solution {
public:
    vector<int> arraysIntersection(vector<int>& arr1, vector<int>& arr2, vector<int>& arr3)
    {
        int cnt=0;
        for(int i=0;i<arr1.size();i++)
        {
            for(int j=0;j<arr2.size();j++)
            {
                if(arr1[i]==arr2[j])
                {
                    for(int k=0;k<arr3.size();k++)
                    {
                        if(arr2[j]==arr3[k])
                        {
                            cnt++;
                            tmp[cnt]=arr3[k];
                        }
                    }
                }
            }
        }
        vector<int> ans;
        for(int i=1;i<=cnt;i++)
        {
            ans.push_back(tmp[i]);
        }
        return ans;
    }
};

5080.查找两棵二叉搜索树之和

给出两棵二叉搜索树,请你从两棵树中各找出一个节点,使得这两个节点的值之和等于目标值 Target。

如果可以找到返回 True,否则返回 False。

示例 1:

输入:root1 = [2,1,4], root2 = [1,0,3], target = 5
输出:true
解释:2 加 3 和为 5 。

示例 2:

输入:root1 = [0,-10,10], root2 = [5,1,7,0,2], target = 18
输出:false

提示:

每棵树上最多有 5000 个节点。
-10^9 <= target, node.val <= 10^9

只有5000个节点,也就是说暴力匹配完全可行(暴力双周赛),用dfs搜出每个节点的值然后再进行比较。

(我写的比较丑)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
int tree1[5001];
int tree2[5001];
int cnt1=0;
int cnt2=0;
void dfs1(TreeNode root)
{
    cnt1++;
    tree1[cnt1]=root.val;
    if(root.left!=NULL)
    {
        dfs1(*root.left);
    }
    if(root.right!=NULL)
    {
        dfs1(*root.right);
    }
    return ;
}
void dfs2(TreeNode root)
{
    cnt2++;
    tree2[cnt2]=root.val;
    if(root.left!=NULL)
    {
        dfs2(*root.left);
    }
    if(root.right!=NULL)
    {
        dfs2(*root.right);
    }
    return ;
}
class Solution {
public:
    bool twoSumBSTs(TreeNode* root1, TreeNode* root2, int target)
    {
        dfs1(*root1);
        dfs2(*root2);
        for(int i=1;i<=cnt1;i++)
        {
            for(int j=1;j<=cnt2;j++)
            {
                if(tree1[i]+tree2[j]==target)
                {
                    return true;
                }
            }
        }
        return false;
    }
};

5081.步进数

如果一个整数上的每一位数字与其相邻位上的数字的绝对差都是 1,那么这个数就是一个「步进数」。

例如,321 是一个步进数,而 421 不是。

给你两个整数,low 和 high,请你找出在 [low, high] 范围内的所有步进数,并返回 排序后 的结果。

示例:

输入:low = 0, high = 21
输出:[0,1,2,3,4,5,6,7,8,9,10,12,21]

提示:

0 <= low <= high <= 2 * 10^9

既然数据量达到了2*10^9那么就不要考虑暴力枚举了,直接按位枚举进行构造,从低位开始,到高位结束,中间每次判断。

int n;
int cnt;
int tans[1000005];
void dfs(int l,int r,long long tp,int thisn,int idx)
{
    if(l<=tp && r>=tp)
    {
        cnt++;
        tans[cnt]=tp;
    }
    if(idx>n)
    {
        return ;
    }
    if(thisn+1<10)
    {
        dfs(l,r,tp*10+thisn+1,thisn+1,idx+1);
    }
    if(thisn-1>=0)
    {
        dfs(l,r,tp*10+thisn-1,thisn-1,idx+1);
    }
    return ;
}
class Solution {
public:
    vector<int> countSteppingNumbers(int low, int high)
    {
        memset(tans,0,sizeof(tans));
        cnt=0;
        int tmp=high;
        n=0;
        while(tmp)
        {
            tmp/=10;
            n++;
        }
        for(int i=1;i<=9;i++)
        {
            dfs(low,high,i,i,1);
        }
        sort(tans+1,tans+1+cnt);
        vector<int> ans;
        if(low==0)
        {
            ans.push_back(0);
        }
        for(int i=1;i<=cnt;i++)
        {
            ans.push_back(tans[i]);
        }
        return ans;
    }
};

5099.验证回文字符串 III

给出一个字符串 s 和一个整数 k,请你帮忙判断这个字符串是不是一个「K 回文」。

所谓「K 回文」:如果可以通过从字符串中删去最多 k 个字符将其转换为回文,那么这个字符串就是一个「K 回文」。

示例:

输入:s = "abcdeca", k = 2
输出:true
解释:删除字符 “b” 和 “e”。

提示:

1 <= s.length <= 1000
s 中只含有小写英文字母
1 <= k <= s.length

这道题最关键的问题在于如何判断是回文串,如果每尝试删除一次再判断那么复杂度肯定是接受不了的。我们换一种思路,先判断回文串再来考虑如何删除元素。我们可以将原串进行反转,这样两个字符串就可以进行匹配哪些位的字符相同,因为这两个字符串是相反的也就是说位置相同的两个字符其实是原串中的镜像关系。

这样我们再来进行删除步骤,将相同位置不同的字符删掉就可以构造一个回文串。这样问题就简化了,我们只需要求出有多少字符是不匹配的再和k比较就可以了,要求不匹配先求匹配,可以用LCS直接求出匹配再比较就行了。

char str[1005];
int f[1005][1005];
class Solution {
public:
    bool isValidPalindrome(string s, int k)
    {
        memset(str,' ',sizeof(str));
        memset(f,0,sizeof(f));
        int n;
        n=s.size();
        for(int i=0;i<n;i++)
        {
            str[i]=s[n-1-i];
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(str[i-1]==s[j-1])
                {
                    f[i][j]=f[i-1][j-1]+1;
                }
                else
                {
                    f[i][j]=max(f[i-1][j],f[i][j-1]);
                }
            }
        }
        if(f[n][n]+k>=n)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
};


暴力大赛,除最后一题外都太简单了,而最后一题只是需要动动脑筋而不需要掌握太高深的算法。

原文地址:https://www.cnblogs.com/Heizesi/p/11631993.html

时间: 2024-10-08 06:14:35

LeetCode双周赛10的相关文章

leetcode 双周赛 Biweekly Contest 6

最后一题比赛快结束的时候想到怎么做了(通过WA的数据猜出来的),比赛后10分钟做出来的.最终做了3题,时间1个小时左右吧. 1150. Check If a Number Is Majority Element in a Sorted Array 这道题理论应该用二分,但是数据量很小(1000),所以就直接暴力过了: class Solution { public: bool isMajorityElement(vector<int>& nums, int target) { int

leetcode 双周赛9 找出所有行中最小公共元素

给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [[1,2,3,4,5],[2,4,5,8,10],[3,5,7,9,11],[1,3,5,7,9]] 输出:5 解法: 暴力解法  就是使用哈希记录每行 然后比较 代码 class Solution { public: unordered_map<int, int> umap[510]; int smalle

[leetcode 双周赛 11] 1228 等差数列中缺失的数字

1228 Missing Number In Arithmetic Progression 等差数列中缺失的数字 问题描述 有一个数组, 其中的值符合等差数列的数值规律, 也就是说: 在?0 <= i < arr.length - 1?的前提下, arr[i+1] - arr[i]?的值都相等. 我们会从该数组中删除一个 既不是第一个 也 不是最后一个的值, 得到一个新的数组??arr. 给你这个缺值的数组?arr, 请你帮忙找出被删除的那个数. 示例 1: 输入: arr = [5,7,11

leetcode 双周赛9 进击的骑士

一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,你的 骑士 驻扎在坐标为 [0, 0] 的方格里. 骑士的走法和中国象棋中的马相似,走 “日” 字:即先向左(或右)走 1 格,再向上(或下)走 2 格:或先向左(或右)走 2 格,再向上(或下)走 1 格. 每次移动,他都可以按八个方向之一前进. 现在,骑士需要前去征服坐标为 [x, y] 的部落,请你为他规划路线. 最后返回所需的最小移动次数即可.本题确保答案是一定存在的. 示例 1: 输入:x = 2,

[LeetCode] Valid Palindrome [10]

题目 Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases. For example, "A man, a plan, a canal: Panama" is a palindrome. "race a car" is not a palindrome. Note: Have you consider t

LeetCode 第 14 场双周赛

基础的 api 还是不够熟悉啊 5112. 十六进制魔术数字 class Solution { public: char *lltoa(long long num, char *str, int radix) { const char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; unsigned long long unum; int i = 0, j, k; if(radix == 10 && num <

Leetcode 179周赛小结

5352. 生成每种字符都是奇数个的字符串 给你一个整数 n,请你返回一个含 n 个字符的字符串,其中每种字符在该字符串中都恰好出现 奇数次 . 返回的字符串必须只含小写英文字母.如果存在多个满足题目要求的字符串,则返回其中任意一个即可. 题解:奇数全填某个字符,偶数先填n-1个字符再填一个不同的字符就可以了. 5353. 灯泡开关 III 题解:顺序遍历题目给的开灯序列.定义两个指针,pos,max_open.pos指向的位置以及其之前的位置所有的灯都是开着的,max_open指向到目前为止,

Leetcode 184周赛题解

前一宿没睡好,困的不行,写的有点慢.. 5380. 数组中的字符串匹配 题目描述: 给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词.请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词.如果你可以删除 words[j] 最左侧和/或最右侧的若干字符得到 word[i] ,那么字符串 words[i] 就是 words[j] 的一个子字符串. 题解: 两次遍历,用kmp判断一下是否是字串. AC代码: class Solution { public: in

【LeetCode】数组-10(66)-数组表示的数加一

思路: 只在digit数组的最后一位加一,如果加一产生进位则当前为减10并且修改进位变量使其在下一次循环的时候对下一位产生加一的影响,如果没有进位的产生直接break循环. 最后判断如果最高位有进位,在重新申请数组(比原来数组长一位),把第一位设置为1,其他的把上面的数组复制过来即可. [正确代码] 1 class Solution { 2 public int[] plusOne(int[] digits) { 3 boolean carry = false;//设置进位 4 digits[d