LeetCode第321场周赛题解

2023-11-19

这周周赛没有什么过多难的 也是可以自己写完的 (芜湖)

第一道题

 6245. 找出中枢整数

给你一个正整数 n ,找出满足下述条件的 中枢整数 x :

1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和。
返回中枢整数 x 。如果不存在中枢整数,则返回 -1 。题目保证对于给定的输入,至多存在一个中枢整数。

示例 1:

输入:n = 8
输出:6
解释:6 是中枢整数,因为 1 + 2 + 3 + 4 + 5 + 6 = 6 + 7 + 8 = 21 。

思路: 这道题 一看就要用到前缀和 的知识 这道题在比赛的时候我用的是 前缀和数组 和 后缀和数组一起加逼 得到答案其实并不需要

比赛时候的代码:

class Solution {
public:
    int pivotInteger(int n) {
        vector<int> presum(n);
        vector<int> postsum(n);
        for(int i=0;i<n;++i)
        {
            presum[i]=i+1;
            postsum[i]=i+1;
        }
        for(int i=1;i<n;++i)
        {
            presum[i]+=presum[i-1];
            postsum[n-1-i]+=postsum[n-1-i+1];
        }
        for(int i=0;i<n;++i)
        {
            if(presum[i]==postsum[i]) return i+1;
        }
        return -1;
    }
};

多了一个后缀和的代码 其实没必要 统计一下sum是多少就好了 然后再减一下就ok

代码如下:

class Solution {
public:
    int pivotInteger(int n) {
        vector<int> presum(n+1);
        int sum=0;
        for(int i=0;i<=n;++i)
        {
            presum[i]=i+1;
            if(i) presum[i]+=presum[i-1];
            sum+=i;
        }
        for(int i=1;i<=n;++i)
        {
            if(presum[i]==sum-presum[i-1]) return i+1;
        }
        return -1;
    }
};

第二题

6246. 追加字符以获得子序列

给你两个仅由小写英文字母组成的字符串 s 和 t 。

现在需要通过向 s 末尾追加字符的方式使 t 变成 s 的一个 子序列 ,返回需要追加的最少字符数。

子序列是一个可以由其他字符串删除部分(或不删除)字符但不改变剩下字符顺序得到的字符串。输入:s = "coaching", t = "coding"
输出:4
解释:向 s 末尾追加字符串 "ding" ,s = "coachingding" 。
现在,t 是 s ("coachingding") 的一个子序列。
可以证明向 s 末尾追加任何 3 个字符都无法使 t 成为 s 的一个子序列。

思路:

这道题也并不难 一开始理解错了 以为是找子串问题 然后就用了 kmp 提交之后看了 错误示例 我就知道哪里错了 然后 就发现 想复杂了 

好了 闲话不多说 讲思路了 这道题的意思就是 寻找在s 中的 t的 子串 含义 s中含有的t的字符串可以不连贯 但必须是 t的 顺序 意思就是 s=ktr   t = kr t就是 s的子序列 但是 如果 s=ing t=ni 那s需要补充一个i 才能实现 所以很好实现这道题 

代码如下:

class Solution {
public:
    int appendCharacters(string s, string t) {
        int i=0,j=0;
        while(i<s.size())
        {
            if(j==t.size()) return 0;
            if(s[i]==t[j]) j++;
            i++;
        }
        return t.size()-j;
    }
};

   

第三题

6247. 从链表中移除节点

给你一个链表的头节点 head 。

对于列表中的每个节点 node ,如果其右侧存在一个具有 严格更大 值的节点,则移除 node 。

返回修改后链表的头节点 head 。

思路 : 利用单调栈 可以维护一个单调小栈 通过维护这个单调小栈 就可以知道 哪些点需要留 哪些点 需要扔掉

deque<int> mp;
        while(h)
        {
            while(!mp.empty() && h->val > mp.back()) mp.pop_back();
            mp.push_back(h->val);
            h=h->next;
        }

 再从链表头开始遍历链表 如果他是单调栈中的元素 就保留 不是就删除 

        if(s->val!=mp.front())
             {
                s->next==NULL;
                delete s;
            }

如果他是单调栈的元素 就需要判断他是不是头节点 我们可以引入一个pre变量 初始化为NULL 可以通过这个来重新将链表串起来


                //第一个点
                if(pre==NULL) {
                    head=s;
                    pre=s;
                }
                //后续节点
                else {
                    pre->next=s;
                    pre=s;
                }

完整代码如下:

class Solution {
public:
    ListNode* removeNodes(ListNode* head) {
        ListNode* h=head;
        deque<int> mp;
        while(h)
        {
            while(!mp.empty() && h->val > mp.back()) mp.pop_back();
            mp.push_back(h->val);
            h=h->next;
        }
        ListNode* pre=NULL;
        ListNode* temp=head;
        while(temp)
        {
            ListNode* s=temp;
            temp=temp->next;
            if(s->val!=mp.front()) {
                s->next==NULL;
                delete s;
            }
            else {
                mp.pop_front();
                //第一个点
                if(pre==NULL) {
                    head=s;
                    pre=s;
                }
                //后续节点
                else {
                    pre->next=s;
                    pre=s;
                }
            }
        }
        return head;
    }
};

第四题

6248. 统计中位数为 K 的子数组

给你一个长度为 n 的数组 nums ,该数组由从 1 到 n 的 不同 整数组成。另给你一个正整数 k 。

统计并返回 num 中的 中位数 等于 k 的非空子数组的数目。

注意:

数组的中位数是按 递增 顺序排列后位于 中间 的那个元素,如果数组长度为偶数,则中位数是位于中间靠 左 的那个元素。
例如,[2,3,1,4] 的中位数是 2 ,[8,4,3,5,1] 的中位数是 4 。
子数组是数组中的一个连续部分。

示例 1:

输入:nums = [3,2,1,4,5], k = 4
输出:3
解释:中位数等于 4 的子数组有:[4]、[4,5] 和 [1,4,5] 。

思路: 这道题 利用的前后缀和 来解题 

#1找到k的位置 同时将 nums数组分别分为 大于 k的(1) 等于k的 (0) 和 小于k的(-1) 方便来计数

// 找出k所在下标idx
        for(int i=0;i<n;i++)
        {
            if(nums[i]==k)
            {
                index = i;
            }
            if(nums[i]<k)
            nums[i] = -1;
            else if(nums[i]==k)
            nums[i] = 0;
            else
            nums[i] = 1;
        }

#2 先遍历 idx之后的数 看有几个大于k的 有几个小于k的 利用一张hash_map来计数 分别记录 从idx开始 有几种情况 

// 枚举idx之后的数与idx+idx之前后缀和的和,和为0或1的数目可计入答案
        unordered_map<int,int> m;
        int s = 0;
        for(int i=index+1;i<n;i++)
        {
            s += nums[i];
            m[s] += 1;
        }

题目说偶数是记录上中位数的 所以我们可以看2个点 0或者1 的点 这两个点都符合题意 

// 枚举idx与idx之前后缀和的和,和为0或1的数目可计入答案
        for(int i=index;i>=0;i--)
        {
            s += nums[i];
            if(m.find(-s)!=m.end())
            {
                res += m[-s];
            }
            

            if(m.find(1-s)!=m.end())
            {
                res += m[1-s];
            }
            
        }

完整代码如下:

class Solution {
public:
    int countSubarrays(vector<int>& nums, int k) {
        int index = 0;
        int res = 0;
        int n = nums.size();
        // 找出k所在下标idx
        for(int i=0;i<n;i++)
        {
            if(nums[i]==k)
            {
                index = i;
            }
            if(nums[i]<k)
            nums[i] = -1;
            else if(nums[i]==k)
            nums[i] = 0;
            else
            nums[i] = 1;
        }

        // 枚举idx之后的数与idx+idx之前后缀和的和,和为0或1的数目可计入答案
        unordered_map<int,int> m;
        int s = 0;
        for(int i=index+1;i<n;i++)
        {
            s += nums[i];
            m[s] += 1;
        }

        m[0] += 1;
        s = 0;

        // 枚举idx与idx之前后缀和的和,和为0或1的数目可计入答案
        for(int i=index;i>=0;i--)
        {
            s += nums[i];
            if(m.find(-s)!=m.end())
            {
                res += m[-s];
            }
            

            if(m.find(1-s)!=m.end())
            {
                res += m[1-s];
            }
            
        }
        return res;
    }
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode第321场周赛题解 的相关文章

随机推荐

  • 如何在Debian(kali)中配置代理(agent)服务器?

    开始搭建代理服务器 首先我参考如下文章进行搭建代理服务器 步骤每一个命令都执行过报了各种错 找了博客 目前尚未开始 我已经知道我的路很长 很难走呀 加油 go go go 第一个教程 第二个教程 Ubuntu Debian CentOS搭建
  • MySQL数据查询 - 简单查询

    简单查询 在MySQL中可以通过SQL语句来实现基本数据查询 SQL语句可以通过如下多种使用 查询所有字段数据 查询指定字段数据 避免重复数据查询 对结果进行排序和分组等查询 数据库中可能包含数量庞大的表 表中可能包含无数的记录 如果没有两
  • 掌握 Effective C++ : 条款01

    背景 Effective C 是每个 C 程序员都应该读的经典之作 书中涵盖了 C 编程中的一系列最佳实践 包括了面向对象设计 模板 STL 异常处理等方面的内容 由于 C 的发展非常迅速 书中的某些内容可能已经过时 但依然是值得好好学习的
  • abc300.com站点被注入脚本

    在进行abc300 com的页面SEO时发现 所有页面受到注入攻击 全部asp页最后被添加一页 弄了1个多小时 大部份页面被清除 目前已经获得www hulijie com的ftp 222 33 63 206 用户名admin 密码尚需分析
  • postgresql 高可用框架对比

    PostgreSQL 的高可用框架有许多种 每种都有其独特的优缺点 下面是一些常见的高可用框架的对比 Pgpool II 这是一个开源的负载均衡和数据库代理 支持主从复制和读写分离 它的优点在于易于安装和使用 缺点是不支持实时备份 Repm
  • Log4Net 日志管理

    Log4Net日志管理 A Log4Net日志管理 Log4Net的日志级别如下 级别 允许的方法 Boolean属性 优先级别 OFF Highest FATAL void Fatal bool IsFatalEnabled RROR v
  • 函数的节流与防抖

    1 节流 节流的意思是 规定时间内 只触发一次 比如我们设定500ms 在这个时间内 无论点击按钮多少次 它都只会触发一次 具体场景可以是抢购时候 由于有无数人 快速点击按钮 如果每次点击都发送请求 就会给服务器造成巨大的压力 但是我们进行
  • C语言-求因子和

    求因子和 题目描述 一个数的因子和不包括它本身的所有因子之和 如12的因子有1 2 3 4 6所以12的因子和是16 现在给定一个数n n lt 10 9 求它的因子和 输入格式 一个数 输出格式 一个数 样例输入 12 样例输出 16 提
  • 有趣的MyBatis——延迟加载

    为什么80 的码农都做不了架构师 gt gt gt 我们知道在resultMap中使用级联对于查找相关数据来说很方便 比如说查找雇员基本信息 顺便得到了雇员的体检信息 家庭信息 部门信息 但是有时我们不需要相关数据 那么在一些复杂的系统中
  • 初学MaxCompute

    MaxComputer是阿里云提供的一种全新的大数据计算服务 其具备更高效的计算及存储能力 本人的理解就是一个类似于HBase Hive的云上的数据仓库 参考官方文档系列 https yq aliyun com articles 85595
  • “ping“不是内部或外部命令,也不是可运行的程序 或批处理文件。

    输入ping 出现问题 ping 不是内部或外部命令 也不是可运行的程序或批处理文件 我的电脑 属性 高级系统设置 环境变量 系统变量 PATH 编辑 输入C Windows System32 再次输入ping 即表示可以了
  • 数据迁移时,需要大量set时的批量操作

    我遇到了一种情况 A类有很多的数据 需要迁移到新的A类或者和字段和A类相同的数据 例如 A1 A2 A3 A4 A100 需要进行批量操作 A1 gt 例 加密 A2 gt 加密 每个字段或部分字段都需要加密 那么正常的情况下需要有多少字段
  • C语言入门

    什么是C语言 C语言是一门通用计算机编程语言 广泛应用于底层开发 C语言的设计目标是提供一种能以简易 的方式编译 处理低级存储器 产生少量的机器码以及不需要任何运行环境支持便能运行的编程 语言 尽管C语言提供了许多低级处理的功能 但仍然保持
  • 谈谈BFC

    谈谈BFC 介绍 BFC Block Formatting Context 块级格式化上下文 它理解成一个独立的区域 此区域里面的子元素不会影响到外面的元素 反之也如此 BFC布局规则 内部的Box会在垂直方向 一个接一个地放置 Box垂直
  • 服务器选哪个系统,服务器选择哪个操作系统

    服务器选择哪个操作系统 内容精选 换一换 裸金属服务器在详情页面显示的云硬盘设备名称与操作系统内部的设备名称不一致 为防止设备名称变化对业务造成影响 建议通过UUID的方式使用云硬盘 当携带云硬盘创建裸金属服务器完成后 裸金属服务器详情界面
  • DenyHosts安装与部署

    DenyHosts是Python语言写的一个程序软件 运行于Linux上预防SSH暴力破解的 它会分析sshd的日志文件 var log secure 当发现重复的攻击时就会记录IP到 etc hosts deny文件 从而达到自动屏IP的
  • Http协议详解

    引入 超文本传输协议 HTTP HyperText Transfer Protocol 是互联网上应用最为广泛的一种网络协议 所有的WWW文件都必须遵守这个标准 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法 1960年美
  • 日赚4.12亿,腾讯最新员工薪酬公布:均薪破100万!!!

    近日 腾讯发布2023年第二季度财报 有一项数据冲上热搜 引起热议 据计算 腾讯人均年薪破100万 网友直呼 酸了酸了 这是认真的吗 跟随播妞一起来看看吧 腾讯员工平均年薪达100万 从大厂财报看互联网行业回暖之势 近日 腾讯发布截至6月3
  • [Python]保姆级win11环境安装Python

    1 下载安装包 https www python org downloads 选择自己的系统对应的安装包 我的是Windows系统 我就直接选择它了 选择64位安装包 根据自己系统对应的安装包 2 开始安装 去下载路径下 双击源文件 开始安
  • LeetCode第321场周赛题解

    这周周赛没有什么过多难的 也是可以自己写完的 芜湖 第一道题 6245 找出中枢整数 给你一个正整数 n 找出满足下述条件的 中枢整数 x 1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和 返回中枢整数 x 如果不存在中枢整