LeetCode 585, 438, 98

news2024/11/24 15:22:59

目录

  • 585. 2016年的投资
    • 题目链接
    • 要求
    • 知识点
    • 思路
    • 代码
  • 438. 找到字符串中所有字母异位词
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 98. 验证二叉搜索树
    • 题目链接
    • 标签
    • 合法区间
      • 思路
      • 代码
    • 中序遍历
      • 思路
      • 代码

585. 2016年的投资

题目链接

585. 2016年的投资

  • Insurance的字段为pidtiv_2015tiv_2016latlon

要求

编写解决方案报告 2016 年 (tiv_2016) 所有满足下述条件的投保人的投保金额之和:

  • 他在 2015 年的投保额 (tiv_2015) 至少跟一个其他投保人在 2015 年的投保额相同。
  • 他所在的城市必须与其他投保人都不同(也就是说 (lat, lon) 不能跟其他任何一个投保人完全相同)。

tiv_2016 四舍五入的 两位小数 。

知识点

  1. count():统计个数的函数。
  2. round():四舍五入的函数。
  3. group by:根据某些字段分组。
  4. having:对分组后的结果进行限制。
  5. in:将字段的值限制到某个集合内。

思路

从要求中可以看出,本题对原表Insurance的数据有两个限制。

第一个限制很好解决,只需要让2015年的投保额tiv_2015在表中出现一次以上即可,这就要统计每个tiv_2015出现的次数,然后筛选出tiv_2015出现次数超过1次的值,接着将表Insurancetiv_2015限制到(in)出现次数超过1次的tiv_2015中。

第二个限制需要思考一下,经度lon的范围为[-180, 180],纬度lat的范围为[-90, 90],所以可以给纬度lat乘1000,然后与经度lon相加,这样就会得到一个唯一的经纬度组合lat * 1000 + lon,每条数据都有这个唯一的经纬度组合。接着在表中统计只出现过一次的经纬度组合,将表Insurance的经纬度组合限制到(in)这些只出现过一次的经纬度组合中。

注意:官方题解中对第二个限制使用了concat()拼接函数,将lat, lon拼接起来,这种方式就不需要计算了。

代码

select
    round(sum(tiv_2016), 2) tiv_2016
from
    Insurance
where
    tiv_2015 in (
        select
            tiv_2015
        from
            Insurance
        group by
            tiv_2015
        having
            count(*) > 1
    )
and
    lat * 1000 + lon in (
        select
            lat * 1000 + lon
        from
            Insurance
        group by
            lat, lon
        having
            count(*) = 1
    )

438. 找到字符串中所有字母异位词

题目链接

438. 找到字符串中所有字母异位词

标签

哈希表 字符串 滑动窗口

思路

要写出本题的答案,得先了解异位词的概念:异位词指由相同字母重排列形成的字符串(包括相同的字符串)。也就是说异位词不关心字符的顺序,只关心字符出现的次数,所以顺理成章地使用一个int[]统计字符出现的次数,由于s, p只含小写字符,所以只需要使用一个长度为26的int[]

先使用int[] target统计目标字符串的字符情况,然后再使用int[] window统计 以原字符串第一个字符s.charAt(0)作为起始字符的窗口 的字符情况,统计完毕后将两个数组进行比较,如果一致,则说明 以原字符串第一个字符s.charAt(0)作为起始字符的窗口 是 目标字符串 的异位词,将窗口第一个字符的索引0加入结果链表。

之后滑动窗口,直到窗口滑动到字符串末尾。每次滑动窗口的之前,先去除窗口的第一个字符,然后再给窗口新增一个字符,接着判断这个窗口的字符情况是否与目标字符串的字符情况一致,如果一致,则记录更新后的窗口(即去除和增加字符后的窗口)的第一个字符的索引。

代码

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        char[] sC = s.toCharArray();
        char[] pC = p.toCharArray();
        int n = sC.length, m = pC.length;

        // 如果待匹配字符串的长度比目标字符串的长度小,则返回空集合
        if (n < m) {
            return new ArrayList<>();
        }

        // 先统计 以sC[0]开头的窗口 的字符 和 目标字符串 的字符
        List<Integer> res = new ArrayList<>();
        int[] window = new int[26]; // 用来统计窗口内的字符情况
        int[] target = new int[26]; // 用来统计目标字符串的字符情况
        for (int i = 0; i < m; i++) {
            target[pC[i] - 'a']++;
            window[sC[i] - 'a']++;
        }

        // 如果 窗口 和 目标字符串 的字符情况一样,则将0存入结果链表
        if (Arrays.equals(target, window)) {
            res.add(0);
        }

        // 滑动窗口,对每个子串进行判断
        for (int i = 0; i < n - m; i++) {
            window[sC[i] - 'a']--; // 移除窗口的第一个字符
            window[sC[i + m] - 'a']++; // 加入新字符

            // 如果 窗口 和 目标字符串 的字符情况一样,则将i + 1存入结果链表
            // 为什么是i + 1而不是i?因为此时已将索引为i的字符从窗口中移除了,窗口的第一个字符的索引为i + 1
            if (Arrays.equals(target, window)) {
                res.add(i + 1);
            }
        }
        return res;
    }
}

98. 验证二叉搜索树

题目链接

98. 验证二叉搜索树

标签

树 深度优先搜索 二叉搜索树 二叉树

合法区间

思路

判断一个二叉树是否是有效的二叉搜索树,就是判断它的每个节点是否满足左子节点的值小于父节点,右子节点的值大于父节点。可以使用两个值min, max记录一个节点的值的合法区间,左子节点的合法区间就是(父节点的min, 父节点的值),右子节点的合法区间就是(父节点的值, 父节点的max),注意:这里的区间都是开区间。初始的minLong.MIN_VALUEmaxLong.MAX_VALUE,这表示根节点的值可以为任意值,不需要限制。

由于本题的测试样例比较特殊,所以min, max的类型不能是int,而是long

二叉搜索树

例如上面这颗二叉树:
节点20的限制为(Long.MIN_VALUE, Long.MAX_VALUE)
节点10的限制为(Long.MIN_VALUE, 20)
节点5的限制为(Long.MIN_VALUE, 10)
节点15的限制为(10, 20)
节点30的限制为(20, Long.MAX_VALUE)
节点25的限制为(20, 30)
节点35的限制为(30, Long.MAX_VALUE)

代码

class Solution {
    public boolean isValidBST(TreeNode root) {
        return judge(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }
    // 判断当前节点的值是否在限制的区间(min, max)内
    private boolean judge(TreeNode curr, long min, long max) {
        if (curr == null) { // 如果本节点为null
            return true; // 则是合法的二叉搜索树
        }
        if (curr.val <= min || curr.val >= max) { // 如果当前节点的值不在区间内
            return false; // 则不是合法的二叉搜索树
        }
        return judge(curr.left, min, curr.val) // 判断左子树是否是合法
                && judge(curr.right, curr.val, max); // 判断右子树是否合法
    }
}

中序遍历

思路

二叉搜索树的中序遍历是有特殊意义的,结果恰好为一个升序的数组。例如上面那张图中序遍历的结果为[5, 10, 15, 20, 25, 30, 35]

对中序遍历不熟悉的可以看这篇文章:94. 二叉树的中序遍历。

故可以使用中序遍历求出当前值的前一个值,如果当前值不大于前一个值,那么这棵树就不是一个有效的二叉搜索树。

所以本解法的重点就是找前一个值,可以使用递归,先遍历左子树(遍历左子树的目的就是为了找前一个节点的值),然后再将本节点与前一个节点进行比较,接着更新前一个节点的值,再比较右子树,最后返回比较的结果。

代码

class Solution {
    private long prevVal = Long.MIN_VALUE; // 存储前一个节点的值
    public boolean isValidBST(TreeNode curr) {
        if (curr == null) { // 如果本节点为null
            return true; // 则是合法的二叉搜索树
        }
        boolean left = isValidBST(curr.left); // 判断左子树是否是合法(遍历左子树,找前一个节点的值)
        if (!(curr.val > prevVal)) { // 如果当前节点的值 不大于 前一个节点的值
            return false; // 则不是合法的二叉搜索树
        }
        prevVal = curr.val; // 更新前一个节点的值,为右子树的比较做准备
        boolean right = isValidBST(curr.right); // 判断右子树是否合法(遍历右子树)
        return left && right; // 返回判断结果
    }
}

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

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

相关文章

RabbitMQ WEB管理端介绍

页面功能概览 Overview(概述)Connections(连接)Channels(通道)Exchanges(交换器)Queues(队列)Admin(用户管理)。 1. Overview(概述) 主要分为三部分 1.1 Queued messages&#xff08;所有队列的消息情况&#xff09; Ready&#xff1a;待消费的消息总数Unacked&#xff1a;待应…

抖音集成:通过MessageBox引领数字化营销新潮流

抖音集成&#xff1a;通过MessageBox引领数字化营销新潮流 在数字化营销的大潮中&#xff0c;企业需要不断探索新的方式来优化其营销策略&#xff0c;以抓住更多的市场机会。抖音作为一款全球知名的短视频社交平台&#xff0c;凭借其庞大的用户群体和高度互动的特性&#xff0…

[leetcode]24-game

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:static constexpr int TARGET 24;static constexpr double EPSILON 1e-6;static constexpr int ADD 0, MULTIPLY 1, SUBTRACT 2, DIVIDE 3;bool judgePoint24(vector<int> &nums) {vector&l…

A股跌懵了,股民一片茫然!

今天的A股跌懵了&#xff0c;股民一片茫然&#xff01;让人脸色苍白&#xff0c;盘面上出现了非常奇怪的一幕&#xff0c;不废话&#xff0c;直接说重点&#xff1a; 1、今天两市低开低走&#xff0c;跌懵了&#xff0c;昨晚人民币汇率大幅贬值&#xff0c;创下7.3的记录&#…

转转游戏MQ重构:思考与心得之旅

文章目录 1 背景1.1 起始之由1.2 重构前现状1.3 问题分析 2 重构2.1 目标2.2 制定方案2.2.1 架构设计2.2.2 实施计划2.2.3 测试计划 2.3 部分细节设计 3. 总结 1 背景 游戏业务自 2017 年启航&#xff0c;至今已近乎走过七个春秋&#xff0c;历经漫长岁月的发展&#xff0c;不…

SpringSecutrity原理

一、基于RBAC实现的权限管理通常需要涉及以下几张表&#xff1a; 1. 用户表&#xff08;user&#xff09;&#xff1a;记录系统中的所有用户&#xff0c;包括用户ID、用户名、密码等信息。 2. 角色表&#xff08;role&#xff09;&#xff1a;记录系统中的所有角色&#xff0…

【MySQL】(基础篇十七) —— 存储过程

存储过程 本文将介绍什么是存储过程&#xff0c;为什么要使用存储过程以及如何使用存储过程&#xff0c;并且介绍创建和使用存储过程的基本语法。 MySQL的存储过程是预编译的SQL语句集合&#xff0c;它们作为一个可执行单元存储在数据库中。存储过程能够封装复杂的业务逻辑&a…

分享一款永久免费内网穿透工具——巴比达内网穿透

最近在做web项目&#xff0c;想办法将web项目映射到公网进行访问&#xff0c;由于没有固定IP&#xff0c;只能使用内网穿透的方法&#xff0c;于是在网上搜索了一番&#xff0c;只有神卓互联旗下的这款巴比达内网穿透是真正免费的&#xff0c; 其它的要么用不了、要么限制没有流…

文件进行周期性备份后权限更改的解决方案--使用脚本和定时任务

这里写目录标题 背景现象解决方案原因分析面临的问题解决思路操作步骤每个文件夹权限分配表测试chmod和chown两个命令是否可行写脚本实现定时同步同时修改权限 异地同步改权限在NAS上生成SSH密钥对将NAS的公钥复制到Linux服务器在NAS上编写同步脚本在NAS上执行脚本&#xff0c;…

记录一次OPDS trunc()函数使用错误

说明&#xff1a;本文介绍 场景 在一次SQL查询时&#xff0c;需要对结果值保留两位小数&#xff0c;不四舍五入&#xff0c;直接截取到小数点后两位。如 59.156到59.15&#xff0c;23.2134到23.21&#xff0c;查看官方帮助文档&#xff08;https://help.aliyun.com/zh/maxcom…

【分享】30秒在线自助制作电子证件照

近期由于自己需要制作电子证件照&#xff0c;所以在网上找在线制作电子证件照的网站&#xff0c;找了很多网站都是收费的&#xff0c;也下载了很多app制作&#xff0c;都是要收费的。最后&#xff0c;所以索性自己开发一个网站制作电子证件照。这里分享给需要的朋友。&#xff…

探索Android架构设计

Android 应用架构设计探索&#xff1a;MVC、MVP、MVVM和组件化 MVC、MVP和MVVM是常见的三种架构设计模式&#xff0c;当前MVP和MVVM的使用相对比较广泛&#xff0c;当然MVC也并没有过时之说。而所谓的组件化就是指将应用根据业务需求划分成各个模块来进行开发&#xff0c;每个…

14、电科院FTU检测标准学习笔记-录波功能2

作者简介&#xff1a; 本人从事电力系统多年&#xff0c;岗位包含研发&#xff0c;测试&#xff0c;工程等&#xff0c;具有丰富的经验 在配电自动化验收测试以及电科院测试中&#xff0c;本人全程参与&#xff0c;积累了不少现场的经验 ———————————————————…

力扣:203. 移除链表元素(Java)

目录 题目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入…

C++学习笔记---POCO库

在Windows系统中安装POCO 1&#xff09;安装OpenSSL POCO编译安装依赖OpenSSL&#xff0c;如果未安装OpenSSL则应该先安装OpenSSL。 假设将OpenSSL安装在C:\OpenSSL-Win64&#xff0c;将C:\OpenSSL-Win64、C:\OpenSSL-Win64\lib添加到PATH环境变量中2&#xff09;安装POCO 将p…

这不是危言耸听!时序Transformer颠覆传统,历史级突破!

【时间序列Transformer】在近年来的深度学习领域中备受关注&#xff0c;它通过将Transformer架构应用于时间序列数据&#xff0c;显著提升了模型在长时间依赖建模和复杂模式识别任务中的表现。时间序列Transformer技术已经在金融预测、气象预报和健康监测等多个领域取得了显著成…

PNAS|这样也可以?拿别人数据发自己Paper?速围观!

还在为数据量小&#xff0c;说服力不足发愁&#xff1f; 想研究脱颖而出、眼前一亮&#xff1f; 想从更高层次的探索微生物的奥秘&#xff0c;发出一篇好文章&#xff1f; 近期&#xff0c;有一篇发表在PNAS(IF11.1)的文章“Deforestation impacts soil biodiversity and ecos…

Swift 周报 第五十六期

文章目录 前言新闻和社区苹果与消费者修改 3500 万美元 iPhone 音响和解协议苹果(AAPL.US)因监管担忧今年不会在欧盟推出 AI 功能苹果暂停高端 Vision 头戴设备研发 计划推出更廉价版 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组自主整理周报的第五十六期&am…

小红书2024LLM论文分享

2024小红书大模型论文分享 BatchEval基于LLM评估LLM生成文本的质量 ACL2024 https://ypw0102.github.io/ 如果文本评价需要多个维度&#xff0c;需要调整BatchEval么&#xff1f; 目前是完整流程走一遍的&#xff0c;因此没有具体考虑细粒度。 评测连续的数据域&#xff0c;S…

JavaScript中的Date对象,以及常用格式化日期的方法封装

一、Date对象 二、操作Date对象 1、创建Date对象 &#xff08;1&#xff09;常用方法 &#xff08;2&#xff09;使用示例 2、获取日期 &#xff08;1&#xff09;常用方法 &#xff08;2&#xff09;使用示例 3、设置日期 &#xff08;1&#xff09;常用方法 &…