【LeetCode每日一题合集】2023.11.20-2023.11.26 (二叉树中的伪回文路径)

news2024/11/18 17:48:46

文章目录

  • 53. 最大子数组和
    • 解法1——DP
    • 解法2——分治(维护区间、类似线段树的思想)
  • 2216. 美化数组的最少删除数(贪心)
  • 2304. 网格中的最小路径代价
  • 1410. HTML 实体解析器(模拟)
  • 2824. 统计和小于目标的下标对数目(简单Q1)
  • 1457. 二叉树中的伪回文路径
  • 828. 统计子串中的唯一字符——贡献法

53. 最大子数组和

https://leetcode.cn/problems/maximum-subarray/description/?envType=daily-question&envId=2023-11-20

在这里插入图片描述

提示:

1 <= nums.length <= 10^5
-10^4 <= nums[i] <= 10^4

进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

解法1——DP

class Solution {
    public int maxSubArray(int[] nums) {
        int ans = Integer.MIN_VALUE, s = 0;
        for (int x: nums) {
            s += x;
            ans = Math.max(ans, s);
            if (s < 0) s = 0;
        }
        return ans;
    }
}

解法2——分治(维护区间、类似线段树的思想)

https://leetcode.cn/problems/maximum-subarray/?envType=daily-question&envId=2023-11-20
在这里插入图片描述

class Solution {
    public int maxSubArray(int[] nums) {
        return getInfo(nums, 0, nums.length - 1).mSum;
    }

    public Status getInfo(int[] a, int l, int r) {
        if (l == r) {
            return new Status(a[l], a[l], a[l], a[l]);
        }
        int m = (l + r) >> 1;
        Status lSub = getInfo(a, l, m);
        Status rSub = getInfo(a, m + 1, r);
        return pushUp(lSub, rSub);
    }

    public Status pushUp(Status l, Status r) {
        int iSum = l.iSum + r.iSum;
        int lSum = Math.max(l.lSum, l.iSum + r.lSum);
        int rSum = Math.max(r.rSum, r.iSum + l.rSum);
        int mSum = Math.max(Math.max(l.mSum, r.mSum), l.rSum + r.lSum);
        return new Status(lSum, rSum, mSum, iSum);
    }
}

class Status {
    // 左端点最大子段和、右端点最大子段和、最大子段和、区间和
    int lSum, rSum, mSum, iSum;

    public Status(int lSum, int rSum, int mSum, int iSum) {
        this.lSum = lSum;
        this.rSum = rSum;
        this.mSum = mSum;
        this.iSum = iSum;
    }
}

2216. 美化数组的最少删除数(贪心)

https://leetcode.cn/problems/minimum-deletions-to-make-array-beautiful/description/?envType=daily-question&envId=2023-11-21
在这里插入图片描述提示:

1 <= nums.length <= 10^5
0 <= nums[i] <= 10^5

只要需要删除,就删除好了。
为什么?——
因为假设不这样做而是删除完整的一组两个连续相同的数字,结果不会比删除nums[i+1]和nums[i+2]更好。
举例:1.1.2.3.3.4.4.5
删除1.1之后为2.3.3.4.4.5最后变成2.3.3.4.4.5
删除1之后为1.2.3.3.4.4.5,最后变成1.2.3.4.4.5
结果是一样的。


我们考虑连续的两组,a,b,c,d 四个数字。
假设a==b,此时有两种选择,
1.删除b
2.删除a和b

对于第一种方法,如果删除b,有两种情况:1.a == c,2.a!=c。
考虑更差的情况,需要同时删除c,得到a,d。
如果a == d,此时abcd四个数字均相同,两种删法结果一样。否则保留ad,删除2个。

对于第二种方法,删除a和b,得到c,d。考虑更差情况c和d一样,还需要多删除一个。

因此删除b的方法更优,即需要删除就删除一个。

class Solution {
    public int minDeletion(int[] nums) {
        int n = nums.length;
        int last = 0, ans = 0;      // last记录上一个下标
        for (int i = 1; i < n; ++i) {
            if (nums[i] == nums[last]) {
                ans++;
            } else {
                last = i + 1;
                i = last;
            }
        }
        if ((n - ans) % 2 == 1) ans++;
        return ans;
    }
}

2304. 网格中的最小路径代价

https://leetcode.cn/problems/minimum-path-cost-in-a-grid/description/?envType=daily-question&envId=2023-11-22

在这里插入图片描述
提示:
m == grid.length
n == grid[i].length
2 <= m, n <= 50
grid 由从 0 到 m * n - 1 的不同整数组成
moveCost.length == m * n
moveCost[i].length == n
1 <= moveCost[i][j] <= 100

时间复杂度: O ( m ∗ n 2 ) O(m∗n^2) O(mn2)
空间复杂度: O ( m ∗ n ) O(m∗n) O(mn)

class Solution {
    public int minPathCost(int[][] grid, int[][] moveCost) {
        int m = grid.length, n = grid[0].length;
        int[][] dp = new int[m][n];
        System.arraycopy(grid[0], 0, dp[0], 0, n);
        for (int i = 1; i < m; ++i) {           // 枚举每一层
            Arrays.fill(dp[i], Integer.MAX_VALUE / 2);
            for (int j = 0; j < n; ++j) {       // 枚举每一列
                for (int k = 0; k < n; ++k) {   // 枚举上一层的每一列
                    dp[i][j] = Math.min(dp[i][j], dp[i - 1][k] + moveCost[grid[i - 1][k]][j] + grid[i][j]);
                }
            }
        }
        return Arrays.stream(dp[m - 1]).min().getAsInt();
    }
}

1410. HTML 实体解析器(模拟)

https://leetcode.cn/problems/html-entity-parser/description/?envType=daily-question&envId=2023-11-23

在这里插入图片描述
提示:

1 <= text.length <= 10^5
字符串可能包含 256 个ASCII 字符中的任意字符。

模拟即可,里面用到了类似分组循环的技巧。

class Solution {
    public String entityParser(String text) {
        StringBuilder ans = new StringBuilder();
        Map<String, String> m = Map.of("quot", "\"",
                                        "apos", "'",
                                        "amp", "&",
                                        "gt", ">",
                                        "lt", "<",
                                        "frasl", "/");
        for (int i = 0; i < text.length(); ++i) {
            if (text.charAt(i) == '&') {
                int j = i + 1;
                while (j < text.length() && text.charAt(j) != ';') j++;
                String k = text.substring(i + 1, j);
                if (m.containsKey(k)) {
                    ans.append(m.get(k));
                    i = j;
                }
                else ans.append(text.charAt(i));
            } else ans.append(text.charAt(i));
        }
        return ans.toString();
    }
}

2824. 统计和小于目标的下标对数目(简单Q1)

https://editor.csdn.net/md/?articleId=134503372

在这里插入图片描述

提示:
1 <= nums.length == n <= 50
-50 <= nums[i], target <= 50

class Solution {
    public int countPairs(List<Integer> nums, int target) {
        int ans = 0, n = nums.size();
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (nums.get(i) + nums.get(j) < target) ++ans;
            }
        }
        return ans;
    }
}

1457. 二叉树中的伪回文路径

https://leetcode.cn/problems/pseudo-palindromic-paths-in-a-binary-tree/description/?envType=daily-question&envId=2023-11-25
在这里插入图片描述

提示:

给定二叉树的节点数目在范围 [1, 10^5] 内
1 <= Node.val <= 9

如果能够构成回文串,那么利用异或的性质,最多只有一位有1。也就是最多只有一个数字出现了奇数次。

class Solution {
    int ans = 0;

    public int pseudoPalindromicPaths (TreeNode root) {
        dfs(root, 0);
        return ans;
    }

    public void dfs(TreeNode root, int x) {
        x ^= 1 << root.val;
        if (root.left == null && root.right == null) {
            if (x == 0 || Integer.bitCount(x) == 1) ++ans;
        }
        if (root.left != null) dfs(root.left, x);
        if (root.right != null) dfs(root.right, x);
    }
}

一个相关题目可见:2791. 树中可以形成回文的路径数,位于:【力扣周赛】第 355 场周赛(构造&二分答案&异或前缀 状态压缩⭐树中可以形成回文的路径数)

828. 统计子串中的唯一字符——贡献法

https://leetcode.cn/problems/count-unique-characters-of-all-substrings-of-a-given-string/description/?envType=daily-question&envId=2023-11-26

在这里插入图片描述

提示:

1 <= s.length <= 10^5
s 只包含大写英文字符

每个字符可以作为唯一字符的范围是从 【前一个该字符出现的位置,后一个该字符出现的位置】。
假设当前字符的位置是i,它的可用范围是 ( l , r ) (l,r) (l,r),不包括 l l l r r r,那么它的贡献是 ( i − l ) ∗ ( r − l ) (i-l)*(r-l) (il)(rl)

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

class Solution {
    public int uniqueLetterString(String s) {
        // 计算每个字符的贡献
        int n = s.length(), ans = 0;
        // 将相同字符的下标放入同一列表
        Map<Character, List<Integer>> m = new HashMap<>();
        for (int i = 0; i < n; ++i) {
            char ch = s.charAt(i);
            if (!m.containsKey(ch)) {
                m.put(ch, new ArrayList<>());
                m.get(ch).add(-1);
            }
            m.get(ch).add(i);
        }
        // 计算答案
        for (List<Integer> ls: m.values()) {
            ls.add(n);
            for (int i = 1; i < ls.size() - 1; ++i) {
                ans += (ls.get(i) - ls.get(i - 1)) * (ls.get(i + 1) - ls.get(i));
            }
        }
        return ans;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS Class Guard 成功了,但无法区分差异

​ 我正在开发一个静态库&#xff0c;并使用 Polidea 的 iOS Class Guard 来混淆我的静态库。我按照步骤在项目的根路径中下载 obfuscate_project&#xff0c;更改其中所需的名称&#xff0c;最后在终端中运行 bash obfuscate_project。我收到一条消息&#xff0c;说我的构建成…

【漏洞复现】大华智慧园区综合管理平台deleteFtp接口远程命令执行

漏洞描述 大华智慧园区综合管理平台deleteFtp接口存在远程命令执行,攻击者可利用该漏洞执行任意命令,获取服务器控制权限。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益…

CMMI认证含金量高吗

一、CMMI认证含金量解答 CMMI&#xff0c;即能力成熟度模型集成&#xff0c;是由美国卡内基梅隆大学软件工程研究所开发的一种评估企业软件开发过程成熟度的模型。CMMI认证的含金量究竟高不高呢&#xff1f;答案是肯定的。CMMI认证被誉为软件开发行业的“金牌标准”&#xff0…

spring cloud gateway源码分析,一个请求进来的默认处理流程

1.前言 spring cloud gateway的基本组成和作用就不细赘述&#xff0c;此篇适合对此有一定了解的人阅读。 spring cloud gateway版本: Hoxton.SR1 spring cloud gateway的配置使用yml配置&#xff1a; server:port: 9527y#根据微服务名称进行动态路由的配置 spring:applicati…

zookeeper心跳检测 (实操课程)

本系列是zookeeper相关的实操课程&#xff0c;课程测试环环相扣&#xff0c;请按照顺序阅读来学习和测试zookeeper。 阅读本文之前&#xff0c;请先阅读----​​​​​​zookeeper 单机伪集群搭建简单记录&#xff08;实操课程系列&#xff09;zookeeper 客户端常用命令简单记录…

人工智能-优化算法之学习率调度器

学习率调度器 到目前为止&#xff0c;我们主要关注如何更新权重向量的优化算法&#xff0c;而不是它们的更新速率。 然而&#xff0c;调整学习率通常与实际算法同样重要&#xff0c;有如下几方面需要考虑&#xff1a; 首先&#xff0c;学习率的大小很重要。如果它太大&#xf…

知识管理平台Confluence:win10安装confluence

文章目录 介绍主要功能 安装教程安装java运行平台JRE安装数据库Postgresql在Postgresql创建confluence使用的数据库创建数据库用户创建数据库 安装confluence注册confluence启动confluence 参考链接 介绍 Confluence 是由澳大利亚软件公司 Atlassian 开发的企业协作平台。它提…

flutter开发实战-ValueListenableBuilder实现局部刷新功能

flutter开发实战-ValueListenableBuilder实现局部刷新功能 在创建的新工程中&#xff0c;点击按钮更新counter后&#xff0c;通过setState可以出发本类的build方法进行更新。当我们只需要更新一小部分控件的时候&#xff0c;通过setState就不太合适了&#xff0c;这就需要进行…

canvas基础:渲染文本

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

java设计模式学习之【桥接模式】

文章目录 引言桥接模式简介定义与用途&#xff1a;实现方式 使用场景优势与劣势桥接模式在Spring中的应用绘图示例代码地址 引言 想象你正在开发一个图形界面应用程序&#xff0c;需要支持多种不同的窗口操作系统。如果每个系统都需要写一套代码&#xff0c;那将是多么繁琐&am…

scrapy爬虫中间件和下载中间件的使用

一、关于中间件 之前文章说过&#xff0c;scrapy有两种中间件&#xff1a;爬虫中间件和下载中间件&#xff0c;他们的作用时间和位置都不一样&#xff0c;具体区别如下&#xff1a; 爬虫中间件&#xff08;Spider Middleware&#xff09; 作用&#xff1a; 爬虫中间件主要负…

SQL Server 2016(基本概念和命令)

1、文件类型。 【1】主数据文件&#xff1a;数据库的启动信息。扩展名为".mdf"。 【2】次要&#xff08;辅助&#xff09;数据文件&#xff1a;主数据之外的数据都是次要数据文件。扩展名为".ndf"。 【3】事务日志文件&#xff1a;包含恢复数据库的所有事务…

深入理解前端路由:构建现代 Web 应用的基石(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

2024年天津天狮学院专升本专业课报名缴费流程

天津天狮学院高职升本缴费流程 一、登录缴费系统 二、填写个人信息&#xff0c;进行缴费 1.在姓名处填写“姓名”&#xff0c;学号处填写“身份证号”&#xff0c;如下图所示&#xff1a; 此处填写身份证号 2.单击查询按钮&#xff0c;显示报考专业及缴费列表&#xff0c;…

JPA数据源Oracle异常记录

代码执行异常 ObjectOptimisticLockingFailureException org.springframework.orm.ObjectOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleSta…

从0开始学习JavaScript--JavaScript ES6 模块系统

JavaScript ES6&#xff08;ECMAScript 2015&#xff09;引入了官方支持的模块系统&#xff0c;使得前端开发更加现代化和模块化。本文将深入探讨 ES6 模块系统的各个方面&#xff0c;通过丰富的示例代码详细展示其核心概念和实际应用。 ES6 模块的基本概念 1 模块的导出 ES…

java原子类型

AtomicBoolean AtomicInteger AtomicLong AtomicReference<V> StringBuilder - 不是原子类型。StringBuilder 是 java.lang 包下的类 用法&#xff1a;无需回调改变数值

基于springboot + vue框架的网上商城系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

Linux:vim的简单使用

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、vim的基本概念二、vim的基本操作三、vim正常模式命令集四、vim底行模式命令集五、.xxx.swp的解决总结 前言 本文是对Linux中vim使用的总结 一、vim的基本概念 …

C语言:求十个数中的平均数

分析&#xff1a; 程序中定义了一个average函数&#xff0c;用于计算分数的平均值。该函数接受一个包含10个分数的数组作为参数&#xff0c;并返回平均值。在主函数main中&#xff0c;首先提示输入10个分数&#xff0c;然后使用循环读取输入的分数&#xff0c;并将它们存储在名…