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

文章目录

  • 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.mfbz.cn/a/208585.html

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

相关文章

k8s ingress 无法找到端点

文章目录 ingress rule无法找到端点这个注解是什么意思呢&#xff1f;为何不生效呢&#xff1f;端点无法更新&#xff1f;如何确认ingressclass呢&#xff1f;修复端点无法发现的问题多个ingress controller 架构 ingress rule无法找到端点 在vnnox-cn集群创建ingress&#xf…

IntelliJ IDEA创建springboot项目时不能选择java8的问题解决方案

最近博主也有创建springboot项目&#xff0c;发现了IntelliJ IDEA在通过Spring Initilizer初始化项目的时候已经没有java8版本的选项了。 基于这个问题&#xff0c;有了这篇文章的分享&#xff0c;希望能够帮助大家克服这个困难。 如图&#xff0c;现在创建springboot项目的时…

win10 修改任务栏颜色 “开始菜单、任务栏和操作中心” 是灰色无法点击,一共就两步,彻底解决有图有真相。

电脑恢复了一下出厂设置、然后任务栏修改要修改一下颜色&#xff0c;之前会后来忘记了&#xff0c;擦。 查了半天文档没用&#xff0c;最后找到官网才算是看到问题解决办法。 问题现象: 解决办法: 往上滑、找到这里 浅色改成深色、然后就可以了&#xff0c;就这么简单。 w…

Drift plus penalty 漂移加惩罚Part2——性能分析

文章目录 正文Performance analysisAverage penalty analysis 平均惩罚分析Average queue size analysis 平均队列大小分析Probability 1 convergenceApplication to queues with finite capacityTreatment of queueing systemsConvex functions of time averages Delay tradeo…

服务器数据恢复—服务器断电导致XenServer数据文件丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌720服务器搭配该品牌某型号RAID卡&#xff0c;使用4块STAT硬盘组建了一组RAID10阵列。服务器上部署XenServer虚拟化平台&#xff0c;系统盘 数据盘两个虚拟机磁盘。虚拟机上安装的是Windows Server操作系统&#xff0c;作为Web服务器使用…

【算法刷题】Day9

文章目录 611. 有效三角形的个数题干&#xff1a;题解&#xff1a;代码&#xff1a; LCR 179. 查找总价格为目标值的两个商品题干&#xff1a;题解&#xff1a;代码&#xff1a; 1137. 第 N 个泰波那契数题干&#xff1a;原理&#xff1a;1、状态表示&#xff08;dp表里面的值所…

如何让Win11的右键菜单恢复到Win10的样式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言如何让Win11的右键菜单恢复到Win10的样式1. winr打开运行&#xff0c;输入cmd后回车2.输入命令并回车3.重启计算机 前言 提示&#xff1a;这里可以添加本文要记…

敌方坦克发射思路[java坦克大战]

1.在敌人坦克类&#xff0c;创建Vector用于保存Shot对象 2.当每创建一个敌人坦克对象&#xff0c;就给该敌人坦克对象初始化一个Shot对象&#xff08;注意子弹初始位置以及必须在设置完敌人坦克初始方向&#xff09;&#xff0c;将该对象加入Vector后&#xff0c;立即启动shot发…

熬夜会秃头——beta冲刺Day7

这个作业属于哪个课程2301-计算机学院-软件工程社区-CSDN社区云这个作业要求在哪里团队作业—beta冲刺事后诸葛亮-CSDN社区这个作业的目标记录beta冲刺Day7团队名称熬夜会秃头团队置顶集合随笔链接熬夜会秃头——Beta冲刺置顶随笔-CSDN社区 一、团队成员会议总结 1、成员工作…

时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标)

时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标) 目录 时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标)预测效果基本介绍环境准备程序设计参考资料预测效果 基本介绍

专注数据采集分析系统研发 做设备与MES系统中转站

数据采集是实现MES系统与设备对接的核心环节。通过采集设备产生的实时数据&#xff0c;将其传输给MES系统进行处理和分析。数据采集可以通过直接连接设备的传感器或者通过设备上安装的采集设备实现。采集的数据可以包括设备的运行状态、产量数据、测量数据、能耗数据等。通过数…

c语言-快速排序

目录 一、实现快速排序三种方法 1、hoare法 2、挖坑法 3、双指针法 4、快速排序的优化 5、测试对比 结语&#xff1a; 前言&#xff1a; 快速排序作为多种排序方法中效率最高的一种&#xff0c;其底层原理被广泛运用&#xff0c;他的核心思想与二叉树结构中的递归逻辑相似…

在re:Invent上IBM宣布与亚马逊云科技携手,Amazon RDS for DB2正式亮相

11月29日&#xff0c;IBM在亚马逊云科技re:Invent 2023上宣布&#xff0c;与亚马逊云科技合作推出Amazon Relational Database Service&#xff08;Amazon RDS&#xff09;for Db2。这项全新的完全托管云服务旨在简化客户在混合云环境中管理人工智能&#xff08;AI&#xff09;…

element中el-table表头通过header-row-style设置样式

文章目录 一、知识点二、设置全部表头2.1、方式一2.2、方式二 三、设置某个表头四、最后 一、知识点 有些时候需要给element-ui表头设置不同样式&#xff0c;比如居中、背景色、字体大小等等&#xff0c;这时就可以用到本文要说的属性header-row-style。官网说明如下所示&…

C++作业4

代码整理&#xff0c; 将学过的三种运算符重载&#xff0c;每个至少实现一个运算符的重载 代码&#xff1a; #include <iostream>using namespace std;class Stu {friend const Stu operator*(const Stu &L,const Stu &R);friend bool operator<(const Stu …

人机协同

人机协同是指人和机器之间进行合作和协同工作的方式&#xff0c;人机协同是人工智能技术发展的一个重要方向&#xff0c;通过人机协同的方式&#xff0c;可以充分利用机器的智能和人的智慧&#xff0c;共同实现更高效、更智能的工作和生活方式。人机协同可以应用于各种领域和场…

卷积神经网络(VGG-16)猫狗识别

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 再次检查数据3. 配置数据集4. 可视化数据 三、构建VG-16网络四、编译五、训练模型六、模型评估七、保存and加载模型八、预测…

2023_Spark_实验二十四:SparkStreaming读取Kafka数据源:使用Direct方式

SparkStreaming读取Kafka数据源&#xff1a;使用Direct方式 一、前提工作 安装了zookeeper 安装了Kafka 实验环境&#xff1a;kafka zookeeper spark 实验流程 二、实验内容 实验要求&#xff1a;实现的从kafka读取实现wordcount程序 启动zookeeper zk.sh start# zk.sh…

Linux系统常用指令

1.使用xshell登录到云服务器的Linux系统&#xff1a; ssh 用户名公网IP&#xff0c;例如&#xff1a; ssh root111.11.111. 2.添加用户 adduser 用户名&#xff0c;例如&#xff1a; adduser user 3.为用户设置密码 passwd 用户名&#xff0c;例如&#xff1a; passwd …

更改Jupyter Notebook 默认存储路径

import osprint(os.path.abspath(.)) 然后打开cmd,输入&#xff1a; jupyter notebook --generate-config 按照路径在本地文件夹中找到那个文件。 然后找到"c.NotebookApp.notebook_dir"这条语句&#xff1a;&#xff08;直接通过"crtlf"输入关键字找阿 …