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拼接起来,这种方式就不需要计算了。

代码

selectround(sum(tiv_2016), 2) tiv_2016
fromInsurance
wheretiv_2015 in (selecttiv_2015fromInsurancegroup bytiv_2015havingcount(*) > 1)
andlat * 1000 + lon in (selectlat * 1000 + lonfromInsurancegroup bylat, lonhavingcount(*) = 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 + 1if (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) { // 如果本节点为nullreturn 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) { // 如果本节点为nullreturn 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.mzph.cn/web/35414.shtml

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

相关文章

Charles网络抓包工具手机抓包配置(二)

目录 事前配置 配置手机连接 代理设置 Https请求设置 手机安装根证书 手机连接代理 证书获取​编辑 证书安装 成果 前言-与正文无关 ​ 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们…

CesiumJS【Basic】- #020 加载glb/gltf文件(Primitive方式)

文章目录 加载glb/gltf文件(Primitive方式)1 目标2 代码实现3 资源文件加载glb/gltf文件(Primitive方式) 1 目标 使用Primitive方式加载glb/gltf文件 2 代码实现 import * as Cesium from "cesium";const viewer = new Cesium.Viewer

ElementPlus Combogrid 组件

效果图: 1.声明 Props类型 export type comboGridPropType { modelValue: any; url: string; keyField?: string; labelField?: string; filterOptions?: Array<ISearchOption>; tableColumns?: Array<TableColumns>; enableField?: string; multiple?: …

Psychtoolbox 脑电实验范式之mp4视频绘制

1. 读取 首先需要使用到Screen(‘OpenMovie’)函数&#xff0c;该函数可以读取mp4、gif格式的数据&#xff0c;具体方式如下&#xff1a; clear; clc; Screen(Preference, SkipSyncTests, 1); screens Screen(Screens); screenNum max(screens); [window, screenRect] Scr…

C++语法20 一维数组及其相关问题详解

这是《C算法宝典》语法入门篇的第20节文章啦~ 如果你之前没有太多C基础&#xff0c;请点击&#x1f449;专栏&#xff1a;C语法入门&#xff0c;如果你C语法基础已经炉火纯青&#xff0c;则可以进阶算法&#x1f449;专栏&#xff1a;算法知识和数据结构&#x1f449;专栏&…

串口通信中字符和16进制显示的区别分析,串口发送数据

分析的原因 在对串口传送数值时&#xff0c;不想再进行一步字符转化&#xff0c;想要直接传送数值。但查看时就需要以16进制的数值形式查看数据&#xff0c;否则将不能看到正确的数据显示 下图是对串口寄存器发送一个16bit位的数据 void uart0Senduint16(UINT16 dat){SBUFdat…

element-plus 日期选择添加确定按钮

需求&#xff1a;选择日期后&#xff0c;点击确定按钮关闭面板 思路&#xff1a; 使用shortcuts自定义确定和取消按钮选择日期后使用handleOpen()强制开启面板点击确定后使用handleClose()关闭面板 <template><el-date-pickerref"pickerRef"v-model"…

【Android11】开机启动日志捕捉服务

一、前言 制作这个功能的原因是客户想要自动的记录日志中的报错和警告到设备的内存卡里面。虽然开发者模式中有一个“bug report” 会在/data/user_de/0/com.android.shell/files/bugreports/目录下生成一个zip包记录了日志。但是客户觉得这个日志很难获取到他们需要的信息&am…

基于盲信号处理的声音分离——基于自然梯度的ICA算法

基于自然梯度的ICA算法主要利用相互独立的随机信号的联合概率密度是各自概率密度的乘积这一特性&#xff0c;建立了等独立性度量原则&#xff0c;具体实现如下。 首先&#xff0c;输出信号 相互独立&#xff0c;则其概率密度满足 上式中 表示 的概率密度函数&#xff0c;可以…

怎么扫描图片变成pdf格式?办公人士值得收藏的宝藏工具

将图片扫描并转换为PDF格式可以通过多种途径实现&#xff0c;无论是使用专业的扫描仪还是智能手机&#xff0c;都有相应的方法。 PDF 是什么&#xff1f; PDF&#xff0c;全称为 Portable Document Format&#xff08;便携式文档格式&#xff09;&#xff0c;是由Adobe System…

12,SPI

Flash芯片&#xff1a;W25Q64&#xff0c;可以看成一个储存器 W25Q64芯片和单片机之间的通信方式是SPI SPI:串行同步全双工&#xff0c;主从通信 判断一个设备是不是SPI通信&#xff0c;看是否有这几个线&#xff1a;SCK&#xff0c;CS&#xff0c;MISO&#xff0c;MOSI SCK…

Altium Designer软件下载安装「PCB设计软件」安装包资源获取

Altium Designer作为一款集成化的电子产品开发系统&#xff0c;它主要适用于Windows操作系统&#xff0c;为电子设计工程师们提供了一个高效、便捷的工作平台。 在Altium Designer中&#xff0c;原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出…

vuex的学习

vuex vuex是个插件&#xff0c;用于多个组件操作共享变量 引入&#xff1a;数字操作案例 基于组件自定义事件而实现的操作数字案例如下&#xff1a; App.vue <template><div id"app"><input class"num_input" type"text" v…

LeeCode 994. 腐烂的橘子

原题链接994. 腐烂的橘子 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;采用bfs遍历图&#xff0c;将烂橘子加入队列&#xff0c;然后将被烂橘子感染的橘子也加入队列&#xff0c;bfs的具体细节就不多说了&#xff0c;可以自己去搜&#xff0c;很简单&#xff0c;…

560.滑动窗口最大值

滑动窗口最大值 239. 滑动窗口最大值 - 力扣&#xff08;LeetCode&#xff09; 题目大意&#xff0c;返回每个窗口内的最大值。 思路-优先队列 优先队列&#xff08;堆&#xff09;&#xff0c;其中的大根堆可以实时维护一系列元素中的最大值。 每当我们向右移动窗口时&#…

地形沉降测量仪器静力水准仪应用全攻略

在地形监测和地质勘探的领域中&#xff0c;地形沉降测量是一项至关重要的工作。它不仅能够及时揭示地质结构的变化&#xff0c;还能为城市规划和基础工程建设提供宝贵的数据支持。在众多测量工具中&#xff0c;静力水准仪以其高精度、高效率的特点&#xff0c;成为地形沉降测量…

AI绘画生成人物的关键词怎么写?手把手教你学会

AI绘画生成人物的关键词怎么写&#xff1f;随着人工智能技术的不断发展&#xff0c;AI绘画已成为艺术领域的一股新势力。特别是在生成人物绘画方面&#xff0c;AI技术以其独特的优势和无限的可能性&#xff0c;为我们带来了全新的创作体验。下面&#xff0c;本文将分享AI绘画生…

svn怎么新建分支,切换分支

在当前分支下&#xff0c;点svn右键&#xff0c;选择分支/标记 在选择远端地址时&#xff0c;点右边更多选项&#xff0c;打开远端版本库。找到对应的分支上级位置&#xff0c;点击确定 填写新分支名称&#xff0c;我这儿是将分支建在了branches下&#xff0c;分支名称为V1.1 填…

【MLP-BEV(7)】深度的计算。针孔相机和鱼眼相机对于深度depth的采样一个是均匀采样,一个是最大深度均匀采样

文章目录 1.1 问题提出1.1 看看DD3D 的深度是怎么处理的给出代码示例 1.2 我们看看BEVDepth的代码 1.1 问题提出 针孔相机和鱼眼相机的投影模型和畸变模型不一样&#xff0c;如果对鱼眼的模型不太了解可以到我的这篇博客【鱼眼镜头11】Kannala-Brandt模型和Scaramuzza多项式模…

vscode刷LeetCode算法题环境配置

首先&#xff0c;下载nodejs 在vscode中安装LeetCode插件 安装好进行配置 选择leetcode-cn 填上刚才下载node.exe的路径 完成之后重启一下vscode 重启之后登陆LeetCode 完成之后就可以看到题目了 点击 code now 就可以开始刷题了