LeetCode 585, 438, 98

目录

  • 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; // 返回判断结果
    }
}

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

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

相关文章

C++ | Leetcode C++题解之第202题快乐数

题目&#xff1a; 题解&#xff1a; class Solution { public:int ProductSum(int n){int sum 0;while(n){int temp n % 10;sum temp*temp;n / 10;}return sum;}bool isHappy(int n) {int slow n,fast n;// 快慢指针&#xff0c;找环的相遇位置do{slow ProductSum(slow)…

基于weixin小程序智慧物业系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;员工管理&#xff0c;房屋管理&#xff0c;缴费管理&#xff0c;车位管理&#xff0c;报修管理 工作人员账号功能包括&#xff1a;系统首页&#xff0c;维…

Unity热更方案 YooAsset+HybridCLR,纯c#开发热更,保姆级教程,从零开始

文章预览&#xff1a; 一、前言二、创建空工程三、接入HybridCLR四、接入YooAsset五、搭建本地资源服务器Nginx六、实战七、最后 一、前言 unity热更有很多方案&#xff0c;各种lua热更&#xff0c;ILRuntime等&#xff0c;这里介绍的是YooAssetHybridCLR的热更方案&#xff0…

通达信机构买卖抓牛指标公式源码

通达信机构买卖抓牛指标公式源码&#xff1a; X_1:V/CLOSE/2; X_2:SUM(IF(X_1>100 AND CLOSE>REF(CLOSE,1),X_1,0),0); X_3:SUM(IF(X_1>100 AND CLOSE<REF(CLOSE,1),X_1,0),0); X_4:SUM(IF(X_1<100 AND CLOSE>REF(CLOSE,1),X_1,0),0); X_5:SUM(IF(X_1&l…

用英文介绍巴黎:Paris, France‘s MEGACITY Europe‘s Largest City

Paris, France’s MEGACITY: Europe’s Largest City Link: https://www.youtube.com/watch?vbdObzSwVAw4&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index22 Paris, France is the grand megacity of Europe at the forefront of human progress. Summary Summary …

macos Automator自动操作 app, 创建自定义 应用程序 app 的方法

mac内置的这个 自动操作 automator 应用程序&#xff0c;可以帮助我们做很多的重复的工作&#xff0c;可以创建工作流&#xff0c; 可以录制并回放操作&#xff0c; 还可以帮助我们创建自定的应用程序&#xff0c;下面我们就以创建一个自定义启动参数的chrome.app为例&#xff…

vue的ESLint 4格缩进 笔记

https://chatgpt.com/share/738c8560-5271-45c4-9de0-511fad862109 一&#xff0c;代码4格缩进设置 .eslintrc.js文件 module.exports { "rules": { "indent": ["error", 4] } }; 自动修复命令 npx eslint --fix "src/**/*.{…

【秋招刷题打卡】Day03-二分系列之-二分答案

Day03-二分系列之-二分答案 给大家推荐一下咱们的 陪伴打卡小屋 知识星球啦&#xff0c;详细介绍 >笔试刷题陪伴小屋-打卡赢价值丰厚奖励 < ⏰小屋将在每日上午发放打卡题目&#xff0c;包括&#xff1a; 一道该算法的模版题 (主要以力扣&#xff0c;牛客&#xff0c;…

React 服务器渲染 Suspense 组件

React 服务器渲染支持 Suspense 组件&#xff0c;Suspense 在子组件未加载成功时会显示 fallback 组件。服务器渲染的时候&#xff0c;React 如何处理 Suspense 组件的呢&#xff1f;由于 Suspense 不同状态下&#xff0c;显示的内容不同&#xff0c;客户端展示时需要区分状态&…

GuLi商城-商品服务-API-三级分类-删除-页面效果

一步步学习Vue太慢了&#xff0c;准备跳过前端的学习&#xff0c;直接使用前端完整的项目 下载依赖npm install&#xff0c;会报错&#xff0c;排查了好久 我安装的是Node14&#xff0c;所以必须要安装4.14 Vscode终端输入&#xff1a;npm install node-sass4.14 输入&#x…

js异常处理方案

文章目录 异常处理方案同步代码的异常处理Promise 的异常处理async await 的异常处理 感谢阅读&#xff0c;觉得有帮助可以点点关注点点赞&#xff0c;谢谢&#xff01; 异常处理方案 在JS开发中&#xff0c;处理异常包括两步&#xff1a;先抛出异常&#xff0c;然后捕获异常。…

一站式uniapp优质源码项目模版交易平台的崛起与影响

一、引言 随着信息技术的飞速发展&#xff0c;软件源码已成为推动行业进步的重要力量。源码的获取、交易和流通&#xff0c;对于开发者、企业以及项目团队而言&#xff0c;具有极其重要的意义。为满足市场对高质量源码资源的迫切需求&#xff0c;一站式uniapp优质源码项目模版…

深度学习实验第T1周:实现mnist手写数字识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 目录 目录 一、前言 二、我的环境 三、…

【数据集划分——针对于原先图片已经整理好类别】训练集|验证集|测试集

目标&#xff1a;用split-folders进行数据集划分 学习资源&#xff1a;https://www.youtube.com/watch?vC6wbr1jJvVs 努力的小巴掌 记录计算机视觉学习道路上的所思所得。 现在已经有了数据集&#xff0c;并且&#xff0c;注意&#xff0c;是已经划分好类别的&#xff01; …

esp12实现的网络时钟校准

网络时间的获取是通过向第三方服务器发送GET请求获取并解析出来的。 在本篇博客中&#xff0c;网络时间的获取是一种自动的行为&#xff0c;当系统成功连接WiFi获取到网络天气后&#xff0c;系统将自动获取并解析得到时间和日期&#xff0c;为了减少误差每两分钟左右进行一次校…

【Docker】创建 swarm 集群

目录 1. 更改防火墙设置 2. 安装 Docker 组件 3. 启动 Docker 服务&#xff0c;并检查服务状态。 4. 修改配置文件&#xff0c;监听同一端口号。 5. 下载 Swarm 组件 6. 创建集群&#xff0c;加入节点 7. 启动集群 8. 查询集群节点信息 9. 查询集群具体信息 10. 查询…

用Python设置Excel工作表网格线的隐藏与显示

Excel表格界面的直观性很大程度上得益于表格中的网格线设计&#xff0c;这些线条帮助用户精确对齐数据&#xff0c;清晰划分单元格。网格线是Excel界面中默认显示的辅助线&#xff0c;用于辅助定位&#xff0c;与单元格边框不同&#xff0c;不影响打印输出。然而&#xff0c;在…

【Linux:文件描述符】

文件描述符&#xff1a; 文件描述符的分配原则&#xff1a;最小未分配原则 每一个进程中有一个task_struct结构体&#xff08;PCB)&#xff0c;而task_struct中含有struct file_sturct*file的指针&#xff0c;该指针指向了一个struct files_struct的结构体该结构体中含有一个f…

Python27 神经网络中的重要概念和可视化实现

1. 神经网络背后的直观知识 神经网络的工作方式非常相似&#xff1a;它接受多个输入&#xff0c;经过多个隐藏层中的多个神经元进行处理&#xff0c;并通过输出层返回结果&#xff0c;这个过程在技术上称为“前向传播”。 接下来&#xff0c;将神经网络的输出与实际输出进行比…

Java | Leetcode Java题解之第202题快乐数

题目&#xff1a; 题解&#xff1a; class Solution {private static Set<Integer> cycleMembers new HashSet<>(Arrays.asList(4, 16, 37, 58, 89, 145, 42, 20));public int getNext(int n) {int totalSum 0;while (n > 0) {int d n % 10;n n / 10;totalS…