当前位置: 首页 > news >正文

LeetCode 2356, 238, 141

目录

  • 2356. 每位教师所教授的科目种类的数量
    • 题目链接
    • 要求
    • 知识点
    • 思路
    • 代码
  • 238. 除自身以外数组的乘积
    • 题目链接
    • 标签
    • 要求
    • 思路
    • 代码
    • 进阶
    • 进阶思想
    • 进阶代码
  • 141. 环形链表
    • 题目链接
    • 标签
    • 思想
    • 代码

2356. 每位教师所教授的科目种类的数量

题目链接

2356. 每位教师所教授的科目种类的数量

  • 表Teacher的字段为teacher_idsubject_iddept_id

要求

  • 查询每位老师在大学里教授的科目种类的数量。
  • 任意顺序 返回结果表。

知识点

  1. group by:按照某个或某些字段的值进行分组。
  2. count():统计个数函数。
  3. distinct:去重。

思路

这道题十分简单,想要查询每位老师在大学里教授的科目种类的数量,可以按老师的idteacher_id进行分组,然后对每位老师教授的科目idsubject_id进行去重的统计。

代码

selectteacher_id,count(distinct subject_id) cnt
fromTeacher
group byteacher_id

238. 除自身以外数组的乘积

题目链接

238. 除自身以外数组的乘积

标签

数组 前缀和

要求

  • 不要使用除法,且在 O ( n ) O(n) O(n) 时间复杂度内完成此题。

思路

先定义两个概念:前缀积和后缀积。对于下标为i的元素,它的前缀积指的是数组中下标小于i的所有元素的乘积,它的后缀积指的是数组中下标大于i的所有元素的乘积。例如对于数组arr = [1, 2, 3, 4, 5]和下标为2的元素,它的前缀积是1 * 2 = 2,后缀积是4 * 5 = 20

可以使用两个数组分别求每个元素的前缀积和后缀积,然后输出每个元素的前缀积与后缀积的乘积即可。

代码

class Solution {public int[] productExceptSelf(int[] nums) {int n = nums.length;int[] prefix = new int[n]; // 求前缀积的数组int[] suffix = new int[n]; // 求后缀积的数组int[] res = new int[n]; // 结果数组// 1. 求前缀积prefix[0] = 1; // 第一个元素的前缀积为1for (int i = 1; i < n; i++) { // 从第二个元素开始prefix[i] = prefix[i - 1] * nums[i - 1];}// 2. 求后缀积suffix[n - 1] = 1; // 最后一个元素的后缀积为1for (int i = n - 2; i >= 0; i--) { // 从倒数第二个元素开始suffix[i] = suffix[i + 1] * nums[i + 1];}// 3. 返回结果for (int i = 0; i < n; i++) {res[i] = prefix[i] * suffix[i];}return res;}
}

进阶

  • 你可以在 O ( 1 ) O(1) O(1) 的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组 不被视为 额外空间。)

进阶思想

大家可能已经发现了一个东西:单独求前缀积(或后缀积)不需要使用一个数组,每个元素的前缀积(或后缀积)只与它的前一个元素(或后一个元素)有关,所以只需要使用一个变量来记录前缀积(或后缀积)

既然不让使用两个数组来辅助计算,那就用结果数组来辅助计算,不妨用结果数组来当作计算前缀积的数组,计算完前缀积后,使用一个变量来记录后缀积(后缀积的初始值为倒数第一个元素),从倒数第二个元素开始(因为倒数第一个值的后缀积为1,不需要再乘),每次都给结果数组乘后缀积,然后再更新一下后缀积。

当然也可以用结果数组当作计算后缀积的数组,这样就需要单独使用一个变量来记录前缀积(前缀积的初始值为第一个元素),从第二个元素开始(因为第一个数的前缀积为1,不需要再乘),每次都给结果数组乘前缀积,然后再更新一下前缀积。

进阶代码

class Solution {public int[] productExceptSelf(int[] nums) {int n = nums.length;int[] res = new int[n]; // 结果数组// 1. 求前缀积res[0] = 1; // 第一个元素的前缀积为1for (int i = 1; i < n; i++) { // 从第二个元素开始res[i] = res[i - 1] * nums[i - 1];}// 2. 求后缀积int suffix = nums[n - 1]; // 倒数第二个元素的后缀积为倒数第一个元素for (int i = n - 2; i >= 0; i--) { // 从倒数第二个元素开始res[i] *= suffix;suffix *= nums[i];}return res;}
}

141. 环形链表

题目链接

141. 环形链表

标签

哈希表 链表 双指针

思想

Floyd判圈算法可以完美地解决这个问题,不熟悉的话可以看我写的这篇博客——算法——Floyd判圈算法。

核心思想是:使用快慢指针fast, slow,快指针每次走两步fast = fast.next.next,慢指针每次走一步slow = slow.next,当出现fast == null || fast.next == null时,说明链表不存在环,如果存在环,则快指针永远不可能指向null。

代码

public class Solution {public boolean hasCycle(ListNode head) {ListNode slow = head;ListNode fast = head;while (fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;if (slow == fast) {return true;}}return false;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 1025 反转链表
  • 大模型PEFT(二) 之 大模型LoRA指令微调实践
  • 【软件工程】第六章
  • 【CS.AL】八大排序算法 —— 快速排序全揭秘:从基础到优化
  • flask轻松入门,概念讲解
  • nodejs最新某东h5st(4.7.2)参数分析与javascript逆向纯算法还原(含算法源码)(2024-06-09)
  • 红黑树的介绍与实现
  • python小tips
  • C++设计模式——Adapter适配器模式
  • 数据结构(C):二叉树前中后序和层序详解及代码实现及深度刨析
  • Effective Java 2 遇到多个构造器参数时要考虑使用构建器
  • neo4j入门并使用案例说明
  • 系统思考—心智模式
  • 嵌入式仪器模块:波形发生器模块(嵌入式)
  • IT学习笔记--Flink
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • angular组件开发
  • IDEA常用插件整理
  • input的行数自动增减
  • Java Agent 学习笔记
  • JS数组方法汇总
  • vue中实现单选
  • webpack入门学习手记(二)
  • 后端_ThinkPHP5
  • 前端性能优化--懒加载和预加载
  • 人脸识别最新开发经验demo
  • 如何合理的规划jvm性能调优
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 详解NodeJs流之一
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #include<初见C语言之指针(5)>
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • #数据结构 笔记三
  • #数学建模# 线性规划问题的Matlab求解
  • (175)FPGA门控时钟技术
  • (C语言)fgets与fputs函数详解
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (ibm)Java 语言的 XPath API
  • (二)linux使用docker容器运行mysql
  • (二)丶RabbitMQ的六大核心
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (三)Honghu Cloud云架构一定时调度平台
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (四)事件系统
  • (循环依赖问题)学习spring的第九天
  • ./configure、make、make install 命令
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net 连接达梦数据库开发环境部署
  • [000-002-01].数据库调优相关学习