怒刷LeetCode的第1天(Java版)

news2024/11/23 20:54:24

目录

第一题

题目来源

题目内容

解决方法

方法一:暴力枚举

方法二:哈希表

第二题

题目来源

题目内容

解决方法

方法一:动态规划

第三题

题目来源

题目内容

解决方法

方法一:模拟


第一题

题目来源

两数之和 - 力扣(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.coloradmin.cn/o/1015667.html

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

相关文章

【python爬虫—星巴克产品】

文章目录 需求爬取星巴克产品以及图片&#xff0c;星巴克菜单 python爬虫爬取结果 需求 爬取星巴克产品以及图片&#xff0c;星巴克菜单 网页分析&#xff1a; 首先&#xff0c;需要分析星巴克官方网站的结构&#xff0c;了解菜单栏的位置、布局以及菜单项的标签或类名等信息…

开源AI家庭自动化助手-手机控制家庭智能家居服务

产品简介 将本地控制和隐私放在首位的开源家庭自动化。由全球开发者和 DIY 爱好者社区提供支持。非常适合在 Raspberry Pi 或本地服务器上运行。 功能介绍 1. 控制面板在控制面板&#xff0c;你可以查看家庭的灯光&#xff0c;温度&#xff0c;门铃&#xff0c;音响&#xf…

激光切割机加工过程中产生毛刺的原因及解决方案

激光切割设备在进行工件加工时产生了大量的工件毛刺。很多人认为是设备质量问题&#xff0c;然而事实并非如此。 毛刺是指在金属制品加工过程中遗留在金属表面的超量残渣颗粒。加工的工件出现毛刺&#xff0c;那么即被认为是次品。 当使用激光切割设备加工工件时&#xff0c;如…

第一类曲面积分:曲面微元dσ与其投影面积微元dxdy之间的关系推导

第一类曲面积分&#xff1a;曲面微元dσ与其投影面积微元dxdy之间的关系推导 本篇博客精简自本人关于曲面积分的博客&#xff1a;详情见&#xff1a;曲面积分(Surface Integral) 曲面参数化&#xff08;曲面上的每个点都使用起点为原点、终点为该曲面上的点的向量表示&#x…

介绍Spring Security框架,以及如何使用它实现应用程序的安全性

文章目录 什么是 Spring Security&#xff1f;Spring Security 的工作原理如何使用 Spring Security 构建安全的应用程序步骤 1&#xff1a;添加 Spring Security 依赖步骤 2&#xff1a;配置 Spring Security步骤 3&#xff1a;配置安全性规则步骤 4&#xff1a;创建用户和角色…

解决mybatis-plus不能俩表联查分页之手动写分页

public class MyPageHelper {// 调用pageInfo插件内的方法 开启分页 需要传入一个起始页的值和每页显示的条数public static void startPage(PageRequest pageRequest) {PageHelper.startPage(pageRequest.getPageNum(),pageRequest.getPageSize());}// 封装结果集public stati…

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

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

linux下使用crontab定时器,并且设置定时不执行的情况,附:项目启动遇到的一些问题和命令

打开终端&#xff0c;以root用户身份登录。 运行以下命令打开cron任务编辑器&#xff1a; crontab -e 如果首次编辑cron任务&#xff0c;会提示选择编辑器。选择你熟悉的编辑器&#xff0c;比如nano或vi&#xff0c;并打开相应的配置文件。 在编辑器中&#xff0c;添加一行类…

SpringMVC工程之非web部分代码复用,并独立运行

文章目录 概述一、独立运行前提二、实现步骤1. WebApplicationContext上下文配置文件定义2.servletContext上下文配置文件3. 定义独立运行的类main方法4. 开发环境运行main结果5. class文件运行6. jar运行&#xff08;推荐&#xff09; 概述 springMVC是位于spring web端的一个…

BeanFactory和ApplicationContext功能

IDEA中双击shift&#xff0c;搜索一切 使用ctrl f12打开当前文件的结构图&#xff0c;显示了当前文件的层次结构&#xff0c;包括类、方法、变量等。 BeanFactory接口功能 表面上只有getBean实际上IOC、DI、以及Bean的生命周期的各种功能&#xff0c;都有其实现类&#xff08…

视频讲解|1033含sop的配电网重构(含风光可多时段拓展)

目录 1 主要内容 程序特点 讲解重点 2 视频链接 1 主要内容 该视频为含sop的配电网重构matlab代码讲解&#xff0c;对应资源下载链接为含sop的配电网重构&#xff08;含风光|可多时段拓展&#xff09;&#xff0c;程序主要内容是&#xff1a;针对含sop的配电网重构模型&…

【AI】推理引擎的模型转换模块

在推理引擎架构中&#xff0c;API 接口下来就是模型转换&#xff0c;狭义的模型转换是指将各种框架的模型转换为统一的格式&#xff0c;即模型格式转换&#xff1b;广义的模型转换则还包括图优化部分&#xff0c;因为不同的框架提供的算子不同&#xff0c;且类型太多&#xff0…

强大的 HTTP 请求工具:axios 打造前后端通信利器 | 开源日报 0916

axios/axios Stars: 101.2k License: MIT axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;适用于浏览器和 node.js。 它具有以下核心优势&#xff1a; 支持在浏览器中进行 XMLHttpRequest在 node.js 中发起 http 请求支持 Promise API拦截请求和响应&#xff0c;并对数…

rust String 和 str 区别

1 String / &String String 类型的变量本质是一个存放在栈上的胖指针&#xff08;当然调用过程中&#xff0c;不用显示地按指针那样处理&#xff09;&#xff0c;共有三个字段&#xff1a; 1 pointer: 指向实际字符串值的地址&#xff0c;值是存放在堆上可变字节缓冲区&a…

驱动开发,stm32mp157a开发板的led灯控制实验(优化),使用ioctl函数,让write/read函数的专注读写功能

1.实验目的 编写LED灯的驱动&#xff0c;在应用程序中编写控制LED灯亮灭的代码逻辑实现LED灯功能的控制&#xff1b; 2.LED灯相关寄存器分析 LED1->PE10 LED1亮灭&#xff1a; RCC寄存器[4]->1 0X50000A28 GPIOE_MODER[21:20]->01 (输出) 0X50006000 GPIOE_ODR[10]-&g…

【Redis7】--3.Redis持久化

Redis持久化 Redis持久化(Redis persistence)是指将数据写入持久化存储&#xff0c;如固态硬盘(SSD) Redis提供了一系列持久化选项&#xff0c;这些包括&#xff1a; RDB(redis数据库)&#xff1a;RDB持久化方式能够在指定的时间间隔对数据进行快照存储AOF(追加文件)&#x…

java写一个用于生成雪花id的工具类

我们创建一个类 叫 SnowflakeIdGenerator 作为生成雪花id的工具类 然后 编写代码如下 public class SnowflakeIdGenerator {private static final long START_TIMESTAMP 1609459200000L; // 设置起始时间戳&#xff0c;可以根据需要进行调整private static final long WORKER…

助力新消费行业“三品”战略,从构建企业身份基础设施开始|身份云研究院

随着工业和信息化部、商务部等五部门联合发布《数字化助力消费品工业“三品”行动方案&#xff08;2022-2025年&#xff09;》&#xff08;以下简称《方案》&#xff09;逐步推行&#xff0c;加速实施数字化助力消费品工业“三品”战略成为消费行业重点任务&#xff0c;其中三品…

基于SpringbootShiro实现的CAS单点登录

概述 单点登录&#xff08;Single Sign On,SSO&#xff09;是一种登录管理机制&#xff0c;主要用于多系统集成&#xff0c;即在多个系统中&#xff0c;用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个&#xff0c;无须多次登录。常见的例子就是&#xff0c;…

java 封装一个将String类型转Long类型的函数

Long是一种超大类型的数字变量类型 但java无法直接生成这种数据 但我们可以封装一个函数 public Long getuniid(String number) {Long longNumber Long.parseLong(number);return longNumber; }这样 我们就可以传入一个字符串 然后将其转换为 long 然后我们调用这个函数 Sys…