LeetCode 176, 289, 437

目录

  • 176. 第二高的薪水
    • 题目链接
    • 要求
    • 知识点
    • 思路
    • 代码
  • 289. 生命游戏
    • 题目链接
    • 标签
    • 简单版
      • 思路
      • 代码
    • 进阶版
      • 思路
      • 代码
  • 437. 路径总和 III
    • 题目链接
    • 标签
    • 思路
    • 代码

176. 第二高的薪水

题目链接

176. 第二高的薪水

  • Employee的字段为idsalary

要求

查询并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None)

知识点

  1. order by:根据某些字段排序。
  2. distinct:根据某个字段去重。
  3. limit:限制查询结果的数量。
  4. offset:跳过指定数量的记录,经常与limit搭配实现分页查询结果,公式为OFFSET = (页码 - 1) * 每页的记录数。例如limit 15 offset 15表示返回第2页数据,共有15条。

思路

查询第二高的薪水时,可以先将数据按薪水降序排列(由于薪水可能重复,所以需要对薪水进行去重操作),然后限制每页只有一条数据,返回第二页的数据。

注意:直接这样查询是不会在没有第二高的薪水返回null,这里需要将查询结果作为子表,然后就能在没有查询结果时返回null了。

代码

select(selectdistinct salaryfromEmployeeorder bysalary desclimit 1offset 1) SecondHighestSalary

289. 生命游戏

题目链接

289. 生命游戏

标签

数组 矩阵 模拟

简单版

思路

注意题目中的“面板上所有格子需要同时被更新:你不能先更新某些格子,然后使用它们的更新后的值再更新其他格子。”这是因为本轮细胞的状态不能由本轮细胞的状态(更新后的值)决定,只能由上一轮细胞的状态决定。这就意味着需要将原先的矩阵拷贝一份,拷贝矩阵便是上一轮的状态,用拷贝矩阵更新原矩阵。

更新的方法很简单,在拷贝矩阵中统计各细胞周围的活细胞数,然后根据题中的四条规则更新这个细胞的值。

代码

class Solution {private int[][] dir = {{-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {1, 0}, {-1, 1}, {0, 1}, {1, 1}}; // 方向数组,分别为 左上 正上 右上 正左 正右 左下 正下 右下public void gameOfLife(int[][] board) {int row = board.length;int col = board[0].length;// 将原矩阵拷贝到新矩阵中int[][] copy = new int[row][col];for (int r = 0; r < row; r++) {for (int c = 0; c < col; c++) {copy[r][c] = board[r][c];}}// 统计拷贝矩阵中每个细胞周围的活细胞数,并根据规则修改原矩阵for (int r = 0; r < row; r++) {for (int c = 0; c < col; c++) {// 统计当前细胞周围的活细胞数int cnt = 0; // 当前细胞周围的活细胞数for (int k = 0; k < 8; k++) {int kr = r + dir[k][0], kc = c + dir[k][1];if (kr >= 0 && kr < row && kc >= 0 && kc < col && copy[kr][kc] == 1) {cnt++;}}// 如果 活细胞 周围八个位置的活细胞数 少于两个 或 超过三个,则该位置活细胞 死亡if (copy[r][c] == 1 && (cnt < 2 || cnt > 3)) {board[r][c] = 0;}// 如果 活细胞 周围八个位置有 两个 或 三个 活细胞,则该位置活细胞仍然存活// 也就是说不需要对其进行操作// 如果 死细胞 周围正好有 三个 活细胞,则该位置死细胞 复活if (copy[r][c] == 0 && cnt == 3) {board[r][c] = 1;}}}}
}

进阶版

思路

既然不使用拷贝矩阵,那就得想一种方法,这种方法使得本轮更新完细胞后还能辨认出这个细胞上一轮的状态,其实很简单,就像制作生命游戏的人一样,再多自定义几种状态,这几种状态表示上一轮是某个状态,而这一轮是另一个状态。

观察更新的四条规则,发现只有两种变化:死亡(上一轮活着,本轮死亡)、复活(上一轮死亡,本轮活着)。所以可以自定义这两种状态分别为2, 3,然后细胞的状态就有四种了:0(死细胞)、1(活细胞)、2(死亡的细胞)、3(复活的细胞)。

更新整个矩阵的策略是:先扫描一遍矩阵,获取每个细胞的状态,然后再扫描一遍,把两种自定义状态还原回0或1。

代码

class Solution {private int[][] dir = {{-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {1, 0}, {-1, 1}, {0, 1}, {1, 1}}; // 方向数组,分别为 左上 正上 右上 正左 正右 左下 正下 右下public void gameOfLife(int[][] board) {int row = board.length;int col = board[0].length;// 统计拷贝矩阵中每个格子周围的活细胞数,并根据规则修改原矩阵for (int r = 0; r < row; r++) {for (int c = 0; c < col; c++) {// 统计当前格子周围的活细胞数int cnt = 0;for (int k = 0; k < 8; k++) {int kr = r + dir[k][0], kc = c + dir[k][1];if (kr >= 0 && kr < row && kc >= 0 && kc < col&& (board[kr][kc] == 1 || board[kr][kc] == 2)) {cnt++;}}// 如果 活细胞 周围八个位置的活细胞数 少于两个 或 超过三个,则该位置活细胞 死亡// 死亡的细胞(board[r][c] == 2)上一轮是活的if ((board[r][c] == 1 || board[r][c] == 2) && (cnt < 2 || cnt > 3)) {board[r][c] = 2; // 死亡}// 如果 活细胞 周围八个位置有 两个 或 三个 活细胞,则该位置活细胞仍然存活// 也就是说不需要对其进行操作// 如果 死细胞 周围正好有 三个 活细胞,则该位置死细胞 复活// 复活的细胞(board[r][c] == 3)上一轮是死的if ((board[r][c] == 0 || board[r][c] == 3) && cnt == 3) {board[r][c] = 3; // 复活}}}// 将自定义状态还原回0和1for (int r = 0; r < row; r++) {for (int c = 0; c < col; c++) {if (board[r][c] == 2) {board[r][c] = 0;} else if (board[r][c] == 3) {board[r][c] = 1;}}}}
}

437. 路径总和 III

题目链接

437. 路径总和 III

标签

树 深度优先搜索 二叉树

思路

本题可以这样做:以二叉树中每个节点为路径的起始节点,探索有没有路径之和恰好为targetSum的路径。

以二叉树中每个节点为路径的起始节点,这个很容易做到,使用递归即可,可以使用前序遍历、中序遍历、后序遍历中的任意一种。

处理当前节点就是探索以本节点curr为路径起点,curr已经在路径中了,让targetSum减去当前节点值curr.val,计算出剩余值rest,在子树中寻找和为剩余值rest的路径。

注意:由于本题的测试用例中有一个节点的val比较大,下一个剩余值rest就超出int的下限了,所以在寻找路径时需要将rest设置为long类型。

代码

class Solution {// 从二叉树根节点开始遍历每个节点,统计 当前节点curr及其子树中 和为targetSum 的路径个数public int pathSum(TreeNode curr, int targetSum) {if (curr == null) { // 如果当前节点为nullreturn 0; // 则没有路径}// 使用了前序遍历:先处理当前节点,再遍历左子树,最后遍历右子树int res = sum(curr, targetSum); // 统计 以curr作为路径起点 和为targetSum 的路径个数res += pathSum(curr.left, targetSum); // 统计 curr的左子树中 和为targetSum 的路径个数res += pathSum(curr.right, targetSum); // 统计 curr的右子树中 和为targetSum 的路径个数return res;}// 统计 以从pathSum中传入的节点curr作为路径起点 和为rest 的路径个数private int sum(TreeNode curr, long rest) {if (curr == null) { // 如果当前节点为nullreturn 0; // 则没有路径}int res = 0; // 路径数int val = curr.val; // 获取当前节点的值if (val == rest) { // 如果当前节点的值 等于 restres++; // 则路径个数 + 1}res += sum(curr.left, rest - val); // 让路径向左子节点走,下一个rest为rest - valres += sum(curr.right, rest - val); // 让路径向右子节点走,下一个rest为rest - valreturn res; // 返回路径个数}
}

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

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

相关文章

苍穹外卖--sky-take-out(五)前端

大部分笔记都是写在语雀的&#xff0c;这是一次性从本人语雀复制过来的&#xff0c;可能结构有些错乱 基础创建 环境要求 node.js npm Vue CLI 创建前端工程 使用vue ui命令创建 项目结构 启动项目 打开命令行窗口 快捷键ctrlj 或者 运行 输入&#xff1a;npm run ser…

010-GeoGebra基础篇-动态验证三角形外接圆的圆心是否可以位于三角形的外部

接下来我们将进行一些稍微高级一点操作&#xff0c;一边学习新东西的同时&#xff0c;也开始对数学、物理等内容的研究。 目录 一、项目截图二、涉及内容三、问题设置1. 问题提出2. 验证方案 三、做图步骤1. 绘制定点A、B&#xff1b;2. 绘制动点C&#xff1b;&#xff08;1&am…

万界星空科技铜管加工行业MES系统解决方案

一、行业背景与挑战 随着铜管加工行业的快速发展&#xff0c;传统的管理模式已难以满足日益增长的生产需求。为满足市场的高效率、高质量、低成本要求&#xff0c;企业急需一套智能化的管理系统来提升生产效率、优化资源配置和确保产品质量。因此&#xff0c;我们针对铜管加工行…

常用的限流算法有哪些?你听说过几种?

限流&#xff0c;就是指限制流量请求的频次。 在高并发情况下&#xff0c;它是一种保护系统的策略&#xff0c;避免了在流量高峰时系统崩溃&#xff0c;造成系统的不可用。 常见的限流算法有&#xff1a; 计数器限流算法滑动窗口限流算法漏桶限流算法令牌桶限流算法 1. 计数器…

【Python程序开发系列】教你使用Docker部署一个简单的Python应用程序(案例+源码)

这是我的第313篇原创文章。 一、引言 Docker 对于程序员来说&#xff0c;其实和Git差不多&#xff0c;基本上属于一个必备工具。如果你想使用这个工具&#xff0c;你就必须安装这个应用工具&#xff0c;至于在不同操作系统上安装Docker的方式网上有很多教程&#xff0c;这里不…

每天五分钟深度学习:解决for循环效率慢的关键在于向量化

本文重点 上一节课程中,我们学习了多样本的线性回归模型,但是我们的伪代码实现中使用了大量的for循环,这样代码的问题是效率很低。为了克服这一瓶颈,向量化技术应运而生,成为提升程序执行效率、加速数据处理速度的重要手段。 向量化技术概述 向量化(Vectorization)是…

MySQL-核心知识要点

1、索引的数据结构-Btree BTree的优势&#xff1a; B树的内节点无data&#xff0c;一个节点可以存储更多的K-V对。在构造树时&#xff0c;需要的内节点会更少&#xff0c;那么树的层级也会越低。查询一条数据时&#xff0c;1. 扫描的层级低&#xff0c;扫描过的节点更少&…

最优化方法Python计算:标准型线性规划的轴转操作

标准型线性规划 { minimize c ⊤ x s.t. A x b x ≥ o ( 1 ) \begin{cases} \text{minimize}\quad\boldsymbol{c}^\top\boldsymbol{x}\\ \text{s.t.}\quad\quad\boldsymbol{Ax}\boldsymbol{b}\\ \quad\quad\quad\quad\boldsymbol{x}\geq\boldsymbol{o} \end{cases}\quad\quad…

【netty系列-04】反应堆模式的种类和具体实现

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…

Vue3认识Vue插件

通常我们向Vue全局添加一些功能时&#xff0c;会采用插件的模式&#xff0c;它有两种编写方式: 对象类型:一个对象&#xff0c;但是必须包含一个install 的函数&#xff0c;该函数会在安装插件时执行;函数类型:一个function&#xff0c;这个函数会在安装插件时自动执行; 插件…

大数据平台之CDH

Clouderas Distribution Including Apache Hadoop (CDH) 是 Cloudera 提供的企业级 Hadoop 发行版&#xff0c;包含了 Hadoop 及其生态系统中的各种组件&#xff0c;并进行了优化和增强&#xff0c;适合在生产环境中使用。以下是 CDH 版本 Hadoop 的详细介绍&#xff1a; 概述…

数字化转型中,数字化如何重塑中小企业发展力?

引言&#xff1a;当前&#xff0c;我国中小微企业数字化转型处于“不平衡、不充分、不规范”阶段&#xff0c;普遍面临“不会转”“不能转”“不敢转”的困境。数字化转型可以帮助企业突破这些困境&#xff0c;实现更大的发展。更进一步&#xff0c;数字化转型是中小企业高质量…

学习笔记——动态路由——IS-IS中间系统到中间系统(基本概念)

二、IS-IS基本概念 1、IS-IS概述 IS-IS是ISO定义的OSI协议栈中的无连接网络服务(ConnectionLess Network Service&#xff0c;CLNS)的一部分&#xff0c;IS-IS是一种链路状态路由协议&#xff0c;IS-IS与OSPF在许多方面非常相似&#xff0c;例如&#xff0c;运行IS-IS协议的直…

4.BeanFactory

可以看出BeanFactory表面上只有getBean相关的方法。 实际上控制反转、基本的依赖注入、Bean的生命周期的各种功能&#xff0c;都是由BeanFactory的实现类来实现的。&#xff08;DefaultListableBeanFactory&#xff09; DefaultListableBeanFactory管理单例对象DefaultSinglet…

压缩和混淆

随着Js文件体积的增大和前后端交互增多&#xff0c;为了加快http传输速度并提高接口的安全性&#xff0c;出现了很多的压缩工具和混淆加密工具。 **代码压缩&#xff1a;**在对用户体验造成影响的因素中&#xff0c;最重要的是“网页打开速度”&#xff0c;即资源加载速度和页…

杨万里,诚斋体的开创者

杨万里&#xff0c;字廷秀&#xff0c;号诚斋&#xff0c;生于南宋绍兴元年&#xff08;公元1127年&#xff09;&#xff0c;卒于南宋庆元二年&#xff08;公元1206年&#xff09;&#xff0c;享年79岁。在中国古代文学的璀璨星河中&#xff0c;南宋诗人杨万里以其清新脱俗、贴…

C#面:现有一个整数number,请写一个方法判断这个整数是否是2的N次方

要判断一个整数是否是2的N次方&#xff0c;可以使用位运算来实现。一个整数如果是2的N次方&#xff0c;那么它的二进制表示中只有一位是1&#xff0c;其余位都是0。可以通过将这个整数与它减去1的结果进行按位与运算&#xff0c;如果结果为0&#xff0c;则说明这个整数是2的N次…

Android- Framework 非Root权限实现修改hosts

一、背景 修改system/etc/hosts&#xff0c;需要具备root权限&#xff0c;而且remount后&#xff0c;才能修改&#xff0c;本文介绍非root状态下修改system/etc/hosts方案。 环境&#xff1a;高通 Android 13 二、方案 非root&#xff0c;system/etc/hosts只有只读权限&…

机器学习python实践——关于管道模型Pipeline和网格搜索GridSearchCV的一些个人思考

最近在利用python跟着指导书进行机器学习的实践&#xff0c;在实践中使用到了Pipeline类方法和GridSearchCV类方法&#xff0c;并且使用过程中发现了一些问题&#xff0c;所以本文主要想记录并分享一下个人对于这两种类方法的思考&#xff0c;如果有误&#xff0c;请见谅&#…

【微服务】微服务之Feign 与 Ribbon

文章目录 强烈推荐引言优点Feign示例什么是Ribbon&#xff1f;Ribbon 的优点Netflix Feign 和 Ribbon整合Feign 与 Ribbon 的关系Feign 与 Ribbon 结合使用的示例配置文件&#xff08;application.yml&#xff09;说明&#xff1a; Feign 与 Ribbon 结合使用的应用场景1. 动态服…