力扣 第 124 场双周赛 解题报告 | 珂学家 | 非常规区间合并


前言

在这里插入图片描述


整体评价

T4的dp解法没想到,走了一条"不归路", 这个区间合并解很特殊,它是带状态的,而且最终的正解也是基于WA的case,慢慢理清的。
真心不容易,太难了。


T1. 相同分数的最大操作数目 I

思路: 模拟

class Solution {
    
    public int maxOperations(int[] nums) {
        int n = nums.length;
        int res = 1;
        for (int i = 2; i + 1 < n; i+= 2) {
            if (nums[i] + nums[i + 1] == nums[0] + nums[1]) {
                res++;
            } else {
                break;
            }
        }
        return res;
    }
    
}

T2. 进行操作使字符串为空

思路: 模拟
感觉有点绕

class Solution {
    public String lastNonEmptyString(String s) {
        List<Integer> []g = new List[26];
        Arrays.setAll(g, x->new ArrayList<>());
        for (int i = 0; i < s.length(); i++) {
            int p = s.charAt(i) - 'a';
            g[p].add(i);
        }
        
        int mz = 0;
        for (int i = 0; i < 26; i++) {
            mz = Math.max(g[i].size(), mz);
        }
        
        List<int[]> lasts = new ArrayList<>();
        for (int i = 0; i < 26; i++) {
            if (g[i].size() == mz) {
                lasts.add(new int[] {i, g[i].get(mz - 1)});
            }
        }
        
        Collections.sort(lasts, Comparator.comparing(x -> x[1]));
        StringBuilder sb = new StringBuilder();
        for (int[] e: lasts) {
            sb.append((char)(e[0] + 'a'));
        }
        return sb.toString();
        
    }
}

T3. 相同分数的最大操作数目 II

思路: 枚举+区间DP

因为要求和相等,所以枚举最初的和,然后记忆化搜索一下就出来了

class Solution {
    
    int dfs(Integer[][] dp, int[] nums, int s, int e, int v) {
        if (s >= e) return 0;
        if (dp[s][e] != null) return dp[s][e];
        
        int res = 0;
        if (nums[s] + nums[e] == v) {
            int r = dfs(dp, nums, s + 1, e - 1, v);
            res = Math.max(res, r + 1);
        }
        if (nums[s] + nums[s + 1] == v) {
            int r = dfs(dp, nums, s + 2, e, v);
            res = Math.max(res, r + 1);
        }            
        if (nums[e - 1] + nums[e] == v) {
            int r = dfs(dp, nums, s, e - 2, v);
            res = Math.max(res, r + 1);
        }
        
        return dp[s][e] = res;
    }
    
    public int maxOperations(int[] nums) {
        int n = nums.length;
        int r1 = dfs(new Integer[n][n], nums, 1, n - 2, nums[0] + nums[n - 1]);
        int r2 = dfs(new Integer[n][n], nums, 2, n - 1, nums[0] + nums[1]);
        int r3 = dfs(new Integer[n][n], nums, 0, n - 3, nums[n - 2] + nums[n - 1]);
        
        return Math.max(r1, Math.max(r2, r3)) + 1;
    }
    
}

T4. 修改数组后最大化数组中的连续元素数目

思路: 区间合并

但是这个区间合并很特别,是带状态的

class Solution {

    static class Segment {
        int start, end;
        int lastStart, full;
        public Segment(int start, int end, int lastStart, int full) {
            this.start = start;
            this.end = end;
            this.lastStart = lastStart;
            this.full = full;
        }
    }
    
    public int maxSelectedElements(int[] nums) {

        int n = nums.length;
        Arrays.sort(nums);

        List<Segment> segs = new ArrayList<>();
        int i = 0;
        while (i < n) {
            int flag = 0;
            int j = i + 1;
            while (j < n && nums[j - 1] + 1 >= nums[j]) {
                if (nums[j - 1] == nums[j]) {
                    flag = 1;
                }
                j++;
            }
            segs.add(new Segment(nums[i], nums[j - 1], nums[i], flag));
            i = j;
        }

        Segment pre = null;
        int res = 0;
        for (Segment seg: segs) {
            if (pre == null) {
                pre = new Segment(seg.start, seg.end, seg.start, seg.full);
            } else {
                if (pre.end + 2 == seg.start) {
                    if (pre.full == 1) {
                        pre = new Segment(pre.start, seg.end, seg.start, seg.full);
                    } else {
                        pre = new Segment(pre.lastStart + 1, seg.end, seg.start, seg.full);
                    }
                } else {
                    pre = new Segment(seg.start, seg.end, seg.start, seg.full);
                }
            }

            res = Math.max(res, pre.end - pre.start + 1);
            if (pre.full == 1) {
                res = Math.max(res, pre.end - pre.start + 2);
            }
        }
        return res;
    }

}

写在最后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/393553.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机构vip教程】Charles(1):Charles的介绍及安装

Charles Charles 是在 Mac &#xff08;Charles是跨平台的 &#xff09;下常用的网络封包截取工具&#xff0c;在做移动开发、测试时&#xff0c;我们为了调试与服务器端的网络通讯协议&#xff0c;常常需要截取网络封包来分析。Charles是一个HTTP代理服务器,HTTP监视器,反转代…

白酒:制曲工艺的微生物多样性及其作用

在云仓酒庄豪迈白酒的制曲工艺中&#xff0c;微生物多样性是一个关键要素。曲是白酒生产中的重要配料&#xff0c;它由小麦、麸皮等原料制成&#xff0c;经过微生物的发酵和生长而形成。微生物的多样性和相互作用对曲的品质和白酒的口感具有重要影响。 首先&#xff0c;微生物多…

【大厂AI课学习笔记】【2.2机器学习开发任务实例】(3)数据准备和数据预处理

项目开始&#xff0c;首先要进行数据准备和数据预处理。 数据准备的核心是找到这些数据&#xff0c;观察数据的问题。 数据预处理就是去掉脏数据。 缺失值的处理&#xff0c;格式转换等。 延伸学习&#xff1a; 在人工智能&#xff08;AI&#xff09;的众多工作流程中&#…

anomalib1.0学习纪实-续2:三个文件夹

为了读懂程序&#xff0c;有三个最重要的文件夹&#xff0c;如下图&#xff1a; 正好对应四个类&#xff0c;如下图&#xff1a; 三个类的来源如下图所示&#xff1a; 注意&#xff0c;MVTec是个大类&#xff0c;里面用到了这里的第四个类MVTecDataset&#xff0c;代码如下。…

Java入门教程:介绍、优势、发展历史以及Hello World程序示例

Java入门教学 java语言介绍 Java是由Sun Microsystems公司(已被Oracle公司收购)于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。由James Gosling和同事们共同研发&#xff0c;并在1995年正式推出。 Java分为三个体系&#xff1a; JavaSE&#xff08;J2SE&…

沁恒CH32V30X学习笔记06---串口dma接收+空闲中断组合接收数据

DMA 控制器提供 18 个通道,其中 DMA1 包含 7 个通道,DMA2 包含 11 个通道,每个通 道对应多个外设请求,通过设置相应外设寄存器中对应 DMA 控制位 通道映射 dma1 dma2 示例代码 bsp_usart_it.c /** bsp_usart_it.c** Created on: 2024年2月18日* Author: admin*/…

快排——OJ题

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、颜色划分1、题目讲解2、算法原理3、代码实现 二、排序数组1、题目讲解2、算法原理3、代码…

创建菜单与游戏页面

bootstrap地址 Bootstrap v5 中文文档 Bootstrap 是全球最受欢迎的 HTML、CSS 和 JS 前端工具库。 | Bootstrap 中文网 (bootcss.com) 创建导航栏组件 web--src--components--NavBar.vue <!-- html --> <template><nav class"navbar navbar-expand-lg n…

设计模式复习

单例模式 确保一个类最多只有一个实例&#xff0c;并提供一个全局访问点。 &#xff08;某个类的对象有且仅有一个&#xff0c;单例的对象充当的是全局变量的角色&#xff0c;为什么在C里面不直接使用全局变量&#xff0c;而是使用单例来代替全局变量&#xff0c;因为如果直接…

【C++学习手札】多态:掌握面向对象编程的动态绑定与继承机制(初识)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;世界上的另一个我 1:02━━━━━━️&#x1f49f;──────── 3:58 &#x1f504; ◀️ ⏸ ▶️ ☰ &am…

删除链表的倒数第N个节点

删除链表的倒数第N个节点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 进阶&#xff1a;你能尝试使用一趟扫描实现吗&#xff1f; 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例…

信息安全认证 | CISP证书怎么样?值得考吗?

HCIE考证研究所的朋友们&#xff0c;新年快乐&#xff01; 今天给大家说说CISP证书&#xff0c;新的一年祝大家逢考必过啊~ 01 考注册信息安全工程师证书的用处 CISP证书可作为学识和技能证明&#xff1b;求职、任职、晋升、加薪的资格凭证&#xff1b;用人单位招聘、录用劳动…

Python函数(一)

目录 一、定义函数 &#xff08;一&#xff09;向函数传递信息 &#xff08;二&#xff09;实参和形参 二、传递实参 &#xff08;一&#xff09;位置实参 &#xff08;二&#xff09;关键字实参 &#xff08;三&#xff09;默认值 &#xff08;四&#xff09;等效的函…

【监控】spring actuator源码速读

目录 1.前言 2.先搂一眼EndPoint 3.EndPoint如何被注入 4.EndPoint如何被暴露 4.1.如何通过http暴露 4.2.如何通过jmx暴露 5.EndPoint是怎么实现监控能力的 6.知道这些的意义是什么 1.前言 版本&#xff1a;spring-boot-starter-actuator 2.6.3 阅读源码一定要带着疑…

【C++学习手札】多态:掌握面向对象编程的动态绑定与继承机制(深入)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;世界上的另一个我 1:02━━━━━━️&#x1f49f;──────── 3:58 &#x1f504; ◀️ ⏸ ▶️ ☰ &am…

VQ30 广告点击的高峰期(order by和limit的连用)

代码 select hour(click_time) as click_hour ,count(hour(click_time)) as click_cnt from user_ad_click_time group by click_hour order by click_cnt desc limit 1知识点 order by和limit的连用&#xff0c;取出所需结果 YEAR() 返回统计的年份 MONTH() 返回统计的月份 D…

渗透测试练习题解析 4(CTF web)

1、[GXYCTF2019]禁止套娃 1 考点&#xff1a;git 泄露 进入靶场后只有一串文字&#xff0c;源代码、抓包之类的都没有敏感信息出现&#xff0c;直接用 kali 的 dirsearch 扫描 发现存在 .git 目录&#xff0c;猜测应该是源码泄露&#xff0c;使用 GitHack 扒一下源码&#xff0…

什么是生产排产管理系统?哪个最好用?

阅读本文&#xff0c;你将了解&#xff1a;一、生产排产管理系统是什么&#xff1b;二、生产排产管理系统的功能&#xff1b;三、盘点五款好用的生产排产管理系统&#xff1b;四、生产排产管理系统的优势。 一、生产排产管理系统是什么 生产排产&#xff0c;也叫生产计划排程…

详解Sora,为什么是AGI的又一个里程碑时刻?

文&#xff5c;郝 鑫 编&#xff5c;王一粟、刘雨琦 2024年伊始&#xff0c;OpenAI再向世界扔了一枚AI炸弹——视频生成模型Sora。 一如一年前的ChatGPT&#xff0c;Sora被认为是AGI&#xff08;通用人工智能&#xff09;的又一个里程碑时刻。 “Sora意味着AGI实现将从1…

基于Doris构建亿级数据实时数据分析系统

背景 随着公司业务快速发展&#xff0c;对业务数据进行增长分析的需求越来越迫切&#xff0c;与此同时我们的业务数据量也在快速激增、每天的数据新增量大概在30w 左右&#xff0c;一年就会产生1 个亿的数据&#xff0c;显然基于传统MySQL数据库已经无法支撑满足以上需求 基于上…