怒刷LeetCode的第1天(Java版)

目录

第一题

题目来源

题目内容

解决方法

方法一:暴力枚举

方法二:哈希表

第二题

题目来源

题目内容

解决方法

方法一:动态规划

第三题

题目来源

题目内容

解决方法

方法一:模拟


第一题

题目来源

两数之和 - 力扣(LeetCode)

题目内容

解决方法

方法一:暴力枚举

class Solution {public int[] twoSum(int[] nums, int target) {// 遍历每个数字for (int i = 0; i < nums.length; i++) {// 从当前数字的下一个位置开始遍历for (int j = i + 1; j < nums.length; j++) {// 判断两个数字之和是否等于目标值if (nums[i] + nums[j] == target) {// 如果满足条件,则返回两个数字的下标return new int[] {i, j};}}}// 若没有找到满足条件的组合,则抛出异常throw new IllegalArgumentException("No two sum solution");}
}

这段代码使用了两个嵌套的循环来遍历数组。外层循环从第一个元素开始,内层循环从外层循环的下一个位置开始。在内层循环中,判断当前两个数字的和是否等于目标值。如果满足条件,就返回这两个数字的下标。如果整个数组都遍历完后没有找到满足条件的组合,就抛出异常表示没有解。

该算法的时间复杂度为 O(n^2),因为需要遍历每对不同的数字。空间复杂度为 O(1),因为没有使用额外的空间来存储数据。

LeetCode运行结果:

方法二:哈希表

注意到方法一的时间复杂度较高的原因是寻找 target - x 的时间复杂度过高。因此,我们需要一种更优秀的方法,能够快速寻找数组中是否存在目标元素。如果存在,我们需要找出它的索引。

import java.util.HashMap;
import java.util.Map;class Solution {public int[] twoSum(int[] nums, int target) {// 创建一个哈希表,用于存储数组中每个数字对应的索引Map<Integer, Integer> map = new HashMap<>();// 遍历数组for (int i = 0; i < nums.length; i++) {// 计算当前数字与目标值的差值int complement = target - nums[i];// 检查差值是否已经在哈希表中存在if (map.containsKey(complement)) {// 如果存在,则返回差值的索引和当前数字的索引return new int[] {map.get(complement), i};}// 将当前数字添加到哈希表中,索引作为值,数字作为键map.put(nums[i], i);}// 若没有找到满足条件的组合,则抛出异常throw new IllegalArgumentException("No two sum solution");}
}

这段代码使用了哈希表来优化查找过程。遍历数组时,我们计算当前数字与目标值的差值,并检查该差值是否已经在哈希表中存在。如果存在,则说明之前遍历过的某个数字与当前数字的和等于目标值,就返回这两个数字的索引。如果不存在,则将当前数字添加到哈希表中,以便后面的数字可以使用它作为差值进行查找。

该算法只需要一次遍历数组,时间复杂度为 O(n)。同时,通过使用哈希表来存储数字和索引的映射关系,可以在 O(1) 的时间复杂度内快速查找差值是否已存在。

LeetCode运行结果:

第二题

题目来源

打家劫舍 - 力扣(LeetCode)

题目内容

解决方法

方法一:动态规划

题目描述已经很清楚了。这是一个动态规划问题。

解题思路:
1、假设dp[i]表示到第i个房间时能够获得的最大金额。
2、状态转移方程:dp[i] = max(dp[i-2]+nums[i], dp[i-1]),表示选择偷当前房间和前两个房间的收益之和与不偷当前房间的收益中的较大值。
3、最终结果为dp[nums.length-1]。

class Solution {public int rob(int[] nums) {if (nums == null || nums.length == 0) {return 0;}int n = nums.length;if (n == 1) {return nums[0];}int[] dp = new int[n]; // 创建一个长度为n的数组,存储中间结果dp[0] = nums[0]; // 第一个房间的最大金额就是它本身的金额dp[1] = Math.max(nums[0], nums[1]); // 第二个房间的最大金额是第一个房间和第二个房间之间金额较大的那个for (int i = 2; i < n; i++) {// 当前房间的最大金额是选择偷当前房间和前两个房间的收益之和与不偷当前房间的收益中的较大值dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);}return dp[n - 1]; // 返回最后一个房间的最大金额}
}

时间复杂度分析: 遍历数组一次,时间复杂度为O(n)。其中n为数组的长度。

空间复杂度分析: 需要一个长度为n的数组来存储中间结果,因此空间复杂度为O(n)。其中n为数组的长度。

LeetCode运行结果:

第三题

题目来源

2. 两数相加 - 力扣(LeetCode)

题目内容

解决方法

方法一:模拟

分析思路与算法如下:

需要实现了两个链表的逐位相加,并返回一个新的链表表示其和。算法的主要思路是使用两个指针分别指向两个链表的当前节点,同时使用一个进位变量来记录上一位的进位情况。

具体算法步骤如下:

  1. 创建一个哑节点作为结果链表的头节点,并创建一个指针curr指向哑节点。
  2. 初始化进位变量carry为0。
  3. 使用一个循环遍历两个链表,直到两个链表都遍历完毕。
  4. 在每一次循环中,首先获取当前节点的值,并将两个节点的值以及进位相加,得到一个新的和。
  5. 将新的和对10取余数,即为当前位的值,并创建一个新的节点插入到结果链表中。
  6. 更新进位变量,将和除以10并取整,得到新的进位值。
  7. 将指针curr后移一位,指向刚插入的新节点。
  8. 如果其中一个链表已经遍历完了,但另一个链表还有剩余节点,那么继续处理剩余节点,并将进位值考虑在内。
  9. 最后检查进位变量是否为0,如果不为0,则追加一个新节点表示最高位的进位。
  10. 返回结果链表的头节点(去掉哑节点)。
class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode dummy = new ListNode(0); // 创建哑节点ListNode curr = dummy; // 当前指针指向哑节点int carry = 0; // 进位变量while (l1 != null || l2 != null) {int val1 = l1 != null ? l1.val : 0;int val2 = l2 != null ? l2.val : 0;int sum = val1 + val2 + carry; // 计算当前位的和carry = sum / 10; // 更新进位值curr.next = new ListNode(sum % 10); // 创建新节点并插入结果链表curr = curr.next; // 指针后移一位if (l1 != null) l1 = l1.next;if (l2 != null) l2 = l2.next;}if (carry != 0) {curr.next = new ListNode(carry); // 还有一个进位没有算进去,追加一个新节点}return dummy.next; // 返回结果链表的头节点(去掉哑节点)}
}

复杂度分析如下:

  • 时间复杂度:假设两个链表的长度分别为 m 和 n,我们需要遍历两个链表中的所有节点,时间复杂度为 O(max(m, n))。
  • 空间复杂度:除了存储结果链表以外,我们只使用了常数级别的额外空间,因此空间复杂度为 O(1)。

综合来看,该代码在时间和空间上都具有较优的复杂度。

LeetCode运行结果:

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

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

相关文章

Python实现查询一个文件中的pdf文件中的关键字

要求&#xff0c;查询一个文件中的pdf文件中的关键字&#xff0c;输出关键字所在PDF文件的文件名及对应的页数。 import os import PyPDF2def search_pdf_files(folder_path, keywords):# 初始化结果字典&#xff0c;以关键字为键&#xff0c;值为包含关键字的页面和文件名列表…

一篇文章教你Pytest快速入门和基础讲解,一定要看!

前言 目前有两种纯测试的测试框架&#xff0c;pytest和unittestunittest应该是广为人知&#xff0c;而且也是老框架了&#xff0c;很多人都用来做自动化&#xff0c;无论是UI还是接口pytest是基于unittest开发的另一款更高级更好用的单元测试框架出去面试也好&#xff0c;跟别…

数据结构_复杂度讲解(附带例题详解)

文章目录 前言什么是数据结构&#xff1f;什么是算法&#xff1f;一. 算法的时间复杂度和空间复杂度1.1 算法效率1.2 如何衡量一个算法好坏 二. 时间复杂度2.1 时间复杂度概念例题一例题一分析 实例一实例一分析 三. 空间复杂度实例实例问题解析 四. 常见复杂度对比五. 常见时间…

netty server端启动源码阅读分析

服务端的启动通过ServerBootstrap类来完成&#xff0c;ServerBootstrap内有以下主要属性 ServerBootstrap extends AbstractBootstrap {//处理channel连接事件的线程组EventLoopGroup group;//处理channel其它事件的线程组EventLoopGroup childGroup;//创建channel的工厂类Cha…

基于Yolov8的野外烟雾检测(3):动态蛇形卷积(Dynamic Snake Convolution),实现暴力涨点 | ICCV2023

目录 1.Yolov8介绍 2.野外火灾烟雾数据集介绍 3.Dynamic Snake Convolution 3.1 Dynamic Snake Convolution加入到yolov8 4.训练结果分析 5.系列篇 1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最…

e签宝,再「进化」

基于ePaaS&#xff0c;e签宝不仅打造了电子签领域的生态圈&#xff0c;也正在赋能整个SaaS行业奔向生态化的良性业态&#xff0c;这将使得SaaS厂商的边界愈发清晰&#xff0c;逐渐实现“量产”&#xff0c;奔向规模化。 作者|斗斗 出品|产业家 1957年11月&#xff0c;江苏…

基于Yolov8的野外烟雾检测(2):多维协作注意模块MCA,效果秒杀ECA、SRM、CBAM等 | 2023.9最新发布

目录 1.Yolov8介绍 2.野外火灾烟雾数据集介绍 3.MCA介绍 4.训练结果分析 5.系列篇 1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&#xff08;SOTA&#xff09;模型&#xff0c;它建立在先前…

phantomjs插件---实现通过链接生成网页截图

Phantomjs | PhantomJS 配置要求 windows下&#xff0c;安装完成phantomJS 设置phantomjs环境变量【也可直接使用phantomjs目录下的执行文件】 直接通过访问php文件执行/通过cmd命令行执行【phantomjs phantom_script.js】 linux下,安装完成phantomJS 设置phantomjs环境变量 直…

Jetpack Compose基础组件 - Image

Image的源码参数预览 Composable fun Image(painter: Painter,contentDescription: String?,modifier: Modifier Modifier,alignment: Alignment Alignment.Center,contentScale: ContentScale ContentScale.Fit,alpha: Float DefaultAlpha,colorFilter: ColorFilter? …

go net/http 源码解读

回顾 1. HTTP Server 在 go 中启动一个 http server 只需短短几行代码 func PingHandler(w http.ResponseWriter, r *http.Request) {io.WriteString(w, "pong!") }func main() {http.HandleFunc("/ping", PingHandler)log.Fatal(http.ListenAndServe(&…

问题记录:飞腾板卡,系统时启动卡住

这是一篇旧记录,但目前调试依然适用。 2019年12月份记录: FT-15000A/16核板卡,系统启动过程卡在麒麟图标处,无法稳定启动。 硬件环境: FT-1500A/16+显卡e8860+USB uPD720201+SATA 88SE9215 ‍ 现象描述: 现象1:使用两片进口LTM4620为CPU核电供电,常温16核工作正常…

如何去掉word上方页眉处的横线

一、问题描述 有时候word总会莫名其妙在页眉处出现一条横线&#xff0c;如图&#xff1a; 二、解决步骤 1.首先点击任一页眉进入页眉编辑状态&#xff0c;然后点击设计&#xff1a; 2.选择页面边框&#xff1a; 3.选择边框——选择无——选择应用于段落——完成。

【笔试强训选择题】Day44.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…

zabbix 钉钉微信企微告警(动作操作消息内容模板)

一、环境配置 1、配置zabbix服务端 2、配置监控主机&监控项&监控模板 zabbix配置安装_this page is used to test the proper operation of _疯飙的蜗牛的博客-CSDN博客 二、触发器 触发器的本质就是一个条件判断&#xff0c;对于不同的监控数据来说&#xff0c;我…

java 企业工程管理系统软件源码 自主研发 工程行业适用

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

从零开始的PICO开发教程(4)-- VR世界 射线传送、旋转和移动

从零开始的PICO开发教程&#xff08;4&#xff09;-- VR世界 射线传送、旋转和移动 文章目录 从零开始的PICO开发教程&#xff08;4&#xff09;-- VR世界 射线传送、旋转和移动一、前言1、大纲 二、VR射线移动功能实现与解析1、区域传送&#xff08;1&#xff09;新建 XR Orig…

志高团队:广阔前景 全新的投资理财体验

当今时代,数字金融迅猛发展,投资理财领域正在经历前所未有的重大变革。作为加拿大华企联合会控股旗下的重要项目,恒贵即将启动,旨在为广大投资者带来全新的投资理财体验。这一创新项目的优势和广阔前景受到了业内观察机构的广泛关注和期待。 恒贵作为一家全新的P2C多元化投资理…

YOLOv3模型原理深度解析

概况 &#xff08;1&#xff09;YOLOv3是YOLO系列第一次引入残差连接来解决深度网络中的梯度消失问题&#xff08;是不是第一次&#xff0c;有待你后面考证&#xff09;&#xff0c;实际用的backbone是DarkNet53 &#xff08;2&#xff09;最显著的改进&#xff0c;也是对你涨…

DM/达梦数据库查询或更新某一列中多个字典码对应内容

准备工作&#xff08;建表、插入数据&#xff09; 1、建立表格&#xff1a;学生-学习科目表student_study 注意&#xff1a;科目kemu列内容是字典码&#xff0c;需要更换成对应内容。 CREATE TABLE "TEST"."STUDENT_STUDY" ( "NAME" VARCHAR(2…

mysql redis的区别

.mysql和redis的数据库类型 mysql是关系型数据库&#xff0c;主要用于存放持久化数据&#xff0c;将数据存储在硬盘中&#xff0c;读取速度较慢。 redis是NOSQL&#xff0c;即非关系型数据库&#xff0c;也是缓存数据库&#xff0c;即将数据存储在缓存中&#xff0c;缓存的读取…