【LeetCode周赛】LeetCode第358场周赛

这篇具有很好参考价值的文章主要介绍了【LeetCode周赛】LeetCode第358场周赛。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数组中的最大数对和

给你一个下标从0开始的整数数组nums。请你从nums中找出和最大的一对数,且这两个数数位上最大的数字相等。
返回最大和,如果不存在满足题意的数字对,返回 -1 。
示例 1:

输入:nums = [51,71,17,24,42] 输出:88 解释: i = 1 和 j = 2 ,nums[i] 和 nums[j]
数位上最大的数字相等,且这一对的总和 71 + 17 = 88 。 i = 3 和 j = 4 ,nums[i] 和 nums[j]
数位上最大的数字相等,且这一对的总和 24 + 42 = 66 。 可以证明不存在其他数对满足数位上最大的数字相等,所以答案是 88 。

示例 2:

输入:nums = [1,2,3,4]
输出:-1
解释:不存在数对满足数位上最大的数字相等。

提示:
2 <= nums.length <= 100
1 <= nums[i] <= 104

思路:
首先根据nums.length可以知道数据范围并不大,因此我们可以直接暴力枚举整数数组nums中的两个数,判断这两个数数位上最大的数字是否相等。维护一个maxx用于存储最大和,若满足条件,即这两个数数位上最大的数字相等,则更新maxx
代码:

class Solution {
public:
    int maxSum(vector<int>& nums) {
        int maxx=-1;
        for(int i=0;i<nums.size();i++){
            for(int j=i+1;j<nums.size();j++){
                int ma1=0,ma2=0,tmp1=nums[i],tmp2=nums[j];
                while(tmp1){
                    ma1=max(ma1,tmp1%10);
                    tmp1/=10;
                }
                while(tmp2){
                    ma2=max(ma2,tmp2%10);
                    tmp2/=10;
                }
                if(ma1==ma2)maxx=max(maxx,nums[i]+nums[j]);
            }
        }
        return maxx;
    }
};

翻倍以链表形式表示的数字

给你一个 非空 链表的头节点 head ,表示一个不含前导零的非负数整数。
将链表 翻倍 后,返回头节点 head 。
示例 1:
【LeetCode周赛】LeetCode第358场周赛,LeetCode,leetcode,算法,数据结构

输入:head = [1,8,9]
输出:[3,7,8]
解释:上图中给出的链表,表示数字 189 。返回的链表表示数字 189 * 2 = 378 。

示例 2:
【LeetCode周赛】LeetCode第358场周赛,LeetCode,leetcode,算法,数据结构

输入:head = [9,9,9]
输出:[1,9,9,8]
解释:上图中给出的链表,表示数字 999 。返回的链表表示数字 999 * 2 = 1998 。

提示:
链表中节点的数目在范围 [ 1 , 1 0 4 ] [1, 10^4] [1,104]
0 < = N o d e . v a l < = 9 0 <= Node.val <= 9 0<=Node.val<=9
生成的输入满足:链表表示一个不含前导零的数字,除了数字 0 本身。

思路:
这道题主要考察的是对链表的操作,既然要对链表翻倍,那么我们一定要考虑到进位如何表示,可以先将链表进行翻转,翻转之后对链表的各个数字进行翻倍的操作会变得简单一些。最后再将链表翻转回来即可。
代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode *reverse(ListNode *p){
        ListNode *q=NULL;
        while(p){//链表翻转
            ListNode *x=(ListNode*)malloc(sizeof(ListNode));
            x->val=p->val;
            if(q==NULL){
                q=x;
                q->next=NULL;
            }
            else{
                x->next=q;
                q=x;
            }
            p=p->next;
        }
        return q;
    }
    ListNode* doubleIt(ListNode* head) {
        int num=0;
        ListNode *p,*x,*q;
        p=head;
        q=reverse(p);
        ListNode *h=q;
        int pre=0;
        while(q){//将链表进行翻倍
            int k=q->val;
            k*=2;
            q->val=k%10+pre;
            pre=k/10;//加在下一位上
            q=q->next;
        }
        h=reverse(h);
        if(pre){//如果最高位也需要进位
            x=(ListNode*)malloc(sizeof(ListNode));
            x->val=pre;
            x->next=NULL;
            x->next=h;
            h=x;
        }
        return h;
    }
};

限制条件下元素之间的最小绝对差

给你一个下标从 0 开始的整数数组 nums 和一个整数 x
请你找到数组中下标距离至少为 x 的两个元素的 差值绝对值 的 最小值 。
换言之,请你找到两个下标 ij ,满足 abs(i - j) >= xabs(nums[i] - nums[j]) 的值最小。
请你返回一个整数,表示下标距离至少为 x 的两个元素之间的差值绝对值的 最小值 。
示例 1:

输入:nums = [4,3,2,4], x = 2
输出:0 解释:我们选择 nums[0] = 4 和 nums[3] = 4 。
它们下标距离满足至少为 2 ,差值绝对值为最小值 0 。 0 是最优解。

示例 2:

输入:nums = [5,3,2,10,15], x = 1
输出:1
解释:我们选择 nums[1] = 3 和 nums[2] = 2 。 它们下标距离满足至少为 1 ,差值绝对值为最小值 1 。 1 是最优解。

示例 3:

输入:nums = [1,2,3,4], x = 3
输出:3
解释:我们选择 nums[0] = 1 和 nums[3] = 4 。它们下标距离满足至少为 3 ,差值绝对值为最小值 3 。 3 是最优解。

提示:
1 < = n u m s . l e n g t h < = 1 0 5 1 <= nums.length <= 10^5 1<=nums.length<=105
1 < = n u m s [ i ] < = 1 0 9 1 <= nums[i] <= 10^9 1<=nums[i]<=109
0 < = x < n u m s . l e n g t h 0 <= x < nums.length 0<=x<nums.length

思路:
看到数据范围,知道暴力枚举方法必定会时间超限,看到两个下标,我第一眼想到的就是双指针,滑动窗口的方法。当我们处理第i个数的时候,如果i+x以及之后的数是有序的,那么我们可以通过二分很快计算出最接近与nums[i]的数。
如何维护这个有序的序列呢。数据结构set可以保证集合的有序,使用multiset可以保证序列中存在重复的数字。
所以我们初始化一个multiset,命名ms,一开始将从x位置往后的所有数字都插入ms中。从下标为0的位置i开始逐一枚举,找到和其下标距离大于等于x且与其最相近的一个数,可以使用lower_bound找到第一个大于等于该数的数a。但是与此同时,我们还需要考虑这个数字a的前一个数字(即小于该数的最大的数),计算这两个数和nums[i]的差值,维护最小值即可。
然后开始移动窗口,往右移动一格,则第i+x的数需要移出,因为距离小于x了。然后还需要将i+1-x位置的数移入,因为该位置距离为x
代码:文章来源地址https://www.toymoban.com/news/detail-655010.html

class Solution {
public:
    int minAbsoluteDifference(vector<int>& nums, int x) {
        if(x==0)return 0;
        multiset<int>ms;//用来维护一个有序的集合
        int n=nums.size();
        for(int i=x;i<n;i++)ms.insert(nums[i]);
        int ans=1e9;
        for(int i=0;i<n;i++){
            auto it=ms.lower_bound(nums[i]);//找到后面的大于等于nums[i]的最小的数字
            if(it!=ms.end())ans=min(ans,*it-nums[i]);
            if(it!=ms.begin())ans=min(ans,nums[i]-*prev(it));//找到该数字的前一个数字
            //移动窗口
            if(i+x<n)ms.erase(ms.find(nums[i+x]));//往后移动,移除
            if(i+1-x>=0)ms.insert(nums[i+1-x]);//这个位置的数也符合要求了
        }
        return ans;
    }
};

到了这里,关于【LeetCode周赛】LeetCode第358场周赛的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • leetcode 第360场周赛

    好久没参加leetcode周赛了,比赛时间都从两小时变成了一个半小时。这次周赛由两道签到题和两道中等难度题组成,严格来说最后一道的难度也可以视为hard,但是只要想到正确的思路,编码还是比较容易的。 比赛链接:leetcode 第 360 场周赛 题目描述 给你一个长度为 n 的字符串

    2024年02月11日
    浏览(37)
  • LeetCode第347场周赛

    2023.5.28LeetCode第347场周赛 从最后一位开始遍历,为0则跳过 暴力模拟 对于每个 s[i] != s[i - 1] ,要使其相等 有两种选择,翻转前 i 个,或者翻转后 n - i 个,选择代价最小的方案 动态规划 从小到大枚举所有值,每个值一定是从更小的数转移而来 定义动态规划数组f, f[i][j] 表示

    2024年02月06日
    浏览(75)
  • LeetCode第343场周赛

    2023.4.30LeetCode第343场周赛 根据题意模拟 使用哈希表记录每个数出现的位置,再用m+n个集合记录每一行和每一列被涂满的格子数,若某行或某列全部被涂满则返回答案 BFS 首先将距离大于两点的曼哈顿距离的特殊路径去掉 每个点考虑经过每个特殊路径到达,分成两段,一段是当

    2024年02月02日
    浏览(42)
  • [LeetCode周赛复盘] 第 348场周赛20230604

    这场可惜了。 T1 模拟。 T2 模拟。 T3 倒序计算。 T4 同时限制上下界的数位DP。 6462. 最小化字符串长度 1. 题目描述 2. 思路分析 题意仔细想一下就会发现,其实会将每个字符仅留1个。 3. 代码实现 6424. 半有序排列 1. 题目描述 2. 思路分析 由于只能相邻交换来移动,因此每次只能

    2024年02月08日
    浏览(41)
  • [LeetCode周赛复盘] 第 359 场周赛20230820

    T1 模拟。 T2 数学贪心。 T3 dp。 T4 分组+滑窗。 2828. 判别首字母缩略词 1. 题目描述 2. 思路分析 按题意模拟即可。 3. 代码实现 2829. k-avoiding 数组的最小总和 1. 题目描述 2. 思路分析 贪心 1~k-1中,选了1就不能选k-1;选了2就不能选k-2… 因此可以选1~k//2 剩余的从k开始向上选。 可以

    2024年02月11日
    浏览(37)
  • [LeetCode周赛复盘] 第 353 场周赛20230709

    感觉有奖品大家都来了。 T1 数学。 T2 dp。 T3 dp。 T4 差分/BIT RUPQ。 6451. 找出最大的可达成数字 1. 题目描述 2. 思路分析 为了使x num在t步内相同,需要相向而行,每步最大缩短距离是2,那么t步距离是2t。 3. 代码实现 6899. 达到末尾下标所需的最大跳跃次数 1. 题目描述 2. 思路分

    2024年02月15日
    浏览(34)
  • leetcode第354场周赛补题

    6889. 特殊元素平方和 - 力扣(LeetCode) 思路:模拟 6929. 数组的最大美丽值 - 力扣(LeetCode) 思路:排序+双指针 6927. 合法分割的最小下标 - 力扣(LeetCode) 思路:哈希+枚举 6924. 最长合法子字符串的长度 - 力扣(LeetCode) 思路:哈希+双指针

    2024年02月16日
    浏览(38)
  • Leetcode 第 365 场周赛题解

    思路 暴力。 代码 复杂度分析 时间复杂度:O(n 3 ),其中 n 是数组 nums 的长度。 空间复杂度:O(1)。 思路 枚举 k,我们需要知道 k 左边 nums[i]−nums[j] 的最大值。 使用 pre_max 维护 k 之前的 nums[i] 的最大值,使用 max_diff 维护 nums[i]−nums[j] 的最大值。 每次遍历一个 nums[i],都更新

    2024年02月07日
    浏览(34)
  • LeetCode 第 388 场周赛个人题解

    目录 100233. 重新分装苹果 原题链接 思路分析 AC代码 100247. 幸福值最大化的选择方案 原题链接 思路分析 AC代码 100251. 数组中的最短非公共子字符串 原题链接 思路分析 AC代码 100216. K 个不相交子数组的最大能量值 原题链接 思路分析 AC代码 100233. 重新分装苹果 直接模拟 降序排

    2024年03月15日
    浏览(61)
  • LeetCode 第385场周赛个人题解

    目录 100212. 统计前后缀下标对 I 原题链接 题目描述 接口描述 思路分析 代码详解 100229. 最长公共前缀的长度 原题链接 题目描述 接口描述 思路分析 代码详解 100217. 出现频率最高的素数 原题链接 题目描述 接口描述 思路分析 代码详解 100212. 统计前后缀下标对 II 原题链接 题目

    2024年02月19日
    浏览(77)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包