每日算法-250514

news2025/7/11 16:41:17

每日算法学习记录 (2024-05-14)

今天记录三道 LeetCode 算法题的解题思路和代码。


1. 两数之和

题目截图:
题目截图

解题思路

这道题要求我们从一个整数数组中找出两个数,使它们的和等于一个给定的目标值 target,并返回这两个数的下标。

核心思路是使用 哈希表 来优化查找过程:

  1. 我们遍历数组 nums。对于当前遍历到的元素 num (设其下标为 i),我们期望找到另一个数 complement = target - num
  2. 在遍历过程中,我们检查哈希表中是否已经存在 complement
    • 如果哈希表中包含 complement,说明我们找到了这两个数。哈希表中存储了 complement 及其对应的下标。此时,直接返回 [哈希表中complement的下标, 当前下标 i]
    • 如果哈希表中不包含 complement,则将当前的 num 及其下标 i 存入哈希表,供后续的元素查找配对。

这样,每个元素只需要被访问一次,哈希表的查找和插入操作平均时间复杂度为 O ( 1 ) O(1) O(1)

复杂度

  • 时间复杂度: O ( n ) O(n) O(n), 其中 n n n 是数组 nums 的长度。我们只需要遍历一次数组。
  • 空间复杂度: O ( n ) O(n) O(n), 最坏情况下,哈希表需要存储 n n n 个元素(例如,没有找到配对或者所有元素都不同且需要到最后才找到配对)。

Code

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> hashTable = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int num = nums[i];
            int complement = target - num;
            if (hashTable.containsKey(complement)) {
                return new int[] {hashTable.get(complement), i};
            }
            hashTable.put(num, i);
        }
        return new int[]{-1, -1}; 
    }
}

1512. 好数对的数目

题目截图:
题目截图

解题思路

题目要求计算数组中 “好数对” (i, j) 的数量,其中 nums[i] == nums[j]i < j

我们可以遍历数组,对于每个元素 nums[x]

  1. 我们需要知道在它之前(即下标小于 x 的位置)有多少个与 nums[x] 相等的元素。
  2. 这些先前出现的相等元素都可以与当前的 nums[x] 组成一个好数对。

为了高效地统计先前出现元素的数量,我们可以使用一个计数数组(或哈希表)。由于题目说明 1 <= nums[i] <= 100,一个大小为 101 的数组 counts 即可胜任,其中 counts[k] 用来记录数字 k 到目前为止出现的次数。

遍历 nums 数组中的每个数字 num

  1. 在遇到当前的 num 时,counts[num] 的值即为之前已经出现过的 num 的数量。这些都可以与当前的 num 配对,所以将 counts[num] 加到总结果 ret 中。
  2. 然后,将 counts[num] 的值加 1,表示当前的 num 也被统计进去了,供后续元素配对使用。

这个过程 ret += counts[num]++; 巧妙地实现了先加旧值再更新的逻辑。

复杂度

  • 时间复杂度: O ( n ) O(n) O(n), 其中 n n n 是数组 nums 的长度。我们只需要遍历一次数组。
  • 空间复杂度: O ( C ) O(C) O(C), 其中 C C C 是数字的取值范围(本题中为 100)。由于 C C C 是常数,可以认为是 O ( 1 ) O(1) O(1)

Code

class Solution {
    public int numIdenticalPairs(int[] nums) {
        int ret = 0;
        int[] counts = new int[101]; 
        for (int num : nums) {
            ret += counts[num];
            counts[num]++;
        }
        return ret;
    }
}

1128. 等价多米诺骨牌对的数量

题目截图:
题目截图

解题思路

题目定义了多米诺骨牌的等价关系:[a, b][c, d] 等价,当且仅当 (a == c && b == d) 或者 (a == d && b == c)。我们需要计算等价多米诺骨牌对的数目。

这个问题的核心在于如何识别等价的骨牌。我们可以为每一张骨牌 [a, b] 定义一个 规范表示。由于 1 <= dominoes[i][j] <= 9,一个常用的方法是将骨牌表示为一个两位数。为了保证 [a, b][b, a] 有相同的规范表示,我们可以约定将较小的数字放在十位,较大的数字放在个位(或者反之,只要统一即可)。
例如,如果约定将较大的数字编码在前面,则对于骨牌 [x, y],其规范键可以表示为 max(x, y) * 10 + min(x, y)。这样,[1, 2][2, 1] 都会被映射到 2 * 10 + 1 = 21

代码中的实现是:
int key = (x[0] > x[1]) ? (x[0] * 10 + x[1]) : (x[1] * 10 + x[0]);
这等价于 max(x[0], x[1]) * 10 + min(x[0], x[1])

一旦我们有了规范的键,问题就转化为了统计具有相同键的骨牌数量,这与上一题 “好数对的数目” 的逻辑类似:

  1. 使用一个计数数组 counts(由于键的范围是 1199,数组大小为 100 即可,counts[key] 记录键 key 出现的次数)。
  2. 遍历所有多米诺骨牌 domino
    a. 计算其规范键 key
    b. 当前骨牌 domino 可以与之前出现过的 counts[key] 个具有相同规范键的骨牌组成等价对。将 counts[key] 加到总结果 ret 中。
    c. 然后,将 counts[key] 的值加 1。

复杂度

  • 时间复杂度: O ( n ) O(n) O(n), 其中 n n ndominoes 数组的长度。我们只需要遍历一次数组。
  • 空间复杂度: O ( C ) O(C) O(C), 其中 C C C 是规范键的可能数量(最大为 99)。由于 C C C 是常数,可以认为是 O ( 1 ) O(1) O(1)

Code

class Solution {
    public int numEquivDominoPairs(int[][] dominoes) {
        int ret = 0;
        int[] counts = new int[100]; 
        for (int[] domino : dominoes) {
            int key = (domino[0] > domino[1]) ? (domino[0] * 10 + domino[1]) : (domino[1] * 10 + domino[0]);
            ret += counts[key];
            counts[key]++;
        }
        return ret;
    }
}

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

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

相关文章

嵌入式培训之数据结构学习(三)gdb调试、单向链表练习、顺序表与链表对比

目录 一、gdb调试 &#xff08;一&#xff09;一般调试步骤与命令 &#xff08;二&#xff09;找段错误&#xff08;无下断点的地方&#xff09; &#xff08;三&#xff09;调试命令 二、单向链表练习 1、查找链表的中间结点&#xff08;用快慢指针&#xff09; 2、找出…

虚拟机安装CentOS7网络问题

虚拟机安装CentOS7网络问题 1. 存在的问题1.1 CentOS7详细信息 2. 解决问题3.Windows下配置桥接模式 1. 存在的问题 虽然已经成功在虚拟机上安装了CentOS7&#xff0c;但是依旧不能上网。 1.1 CentOS7详细信息 [fanzhencentos01 ~]$ hostnamectlStatic hostname: centos01Ic…

迅为RK3588开发板安卓GPIO调用APP运行测试

将网盘上的安卓工程文件复制到 Windows 电脑上。确保工程路径中使用英文字符&#xff0c;不包含中文。接着&#xff0c;启动 Android Studio&#xff0c;点击“Open”按钮选择应用工程文件夹&#xff0c;然后点击“OK”。由于下载 Gradle 和各种 Jar 包可能需要一段时间&#x…

Unity 红点系统

首先明确一个&#xff0c;即红点系统的数据结构是一颗树&#xff0c;并且红点的数据结构的初始化需要放在游戏的初始化中&#xff0c;之后再是对应的红点UI侧的注册&#xff0c;对应的红点UI在销毁时需要注销对红点UI的显示回调注册&#xff0c;但是不销毁数据侧的红点注册 - …

尼康VR镜头防抖模式NORMAL和ACTIVE的区别(私人笔记)

1. NORMAL 模式&#xff08;常规模式&#xff09; 适用场景&#xff1a;一般手持拍摄&#xff0c;比如人像、静物、风景或缓慢平移镜头&#xff08;如水平追拍&#xff09;等。工作特性&#xff1a; 补偿手抖引起的小幅度震动&#xff08;比如手持时自然的不稳&#xff09;&am…

从索引中排除 Elasticsearch 字段

作者&#xff1a;来自 Elastic Kofi Bartlett 说明如何配置 Elasticsearch 排除字段、为什么要这样做&#xff0c;以及应遵循的最佳实践。 更多阅读&#xff1a;Elasticsearch&#xff1a;inverted index&#xff0c;doc_values 及 source 想获得 Elastic 认证&#xff1f;了解…

超详细Docker教程

前言&#xff1a;大家在在Linux上部署mysql及其他软件时&#xff0c;大家想一想自己最大的感受是什么&#xff1f; 我相信&#xff0c;除了个别天赋异禀的人以外&#xff0c;大多数人都会有相同的感受&#xff0c;那就是麻烦。核心体现在三点&#xff1a; 命令太多了&#xff…

Java项目拷打(外卖+点评)

一、点评星球&#xff08;黑马点评&#xff09; 1、项目概述 1.1、项目简介 本项目是基于Spring Boot与Redis深度整合的前后端分离的点评平台。系统以Redis为核心技术支撑&#xff0c;重点解决高并发场景下的缓存穿透、击穿、雪崩等问题&#xff0c;涵盖商户展示、优惠券秒杀…

微信小程序仿淘宝拍照/照片点位识图、点位裁剪生图、图片裁剪组件、图片点位框选、裁剪生成图片,canvasToImg

实现效果 效果&#xff1a; 1.微信小程序仿淘宝拍照/照片点位识图、根据点位裁剪生图、图片可裁剪、图片高度可控 2.识别点位自动生成标准构图方案&#xff0c;支持手动微调实现像素级精准裁剪 3.可以根据接口识别的点位信息实现拍照/相册图片特征点自动识别并裁剪 实现步骤 …

Qt/C++开发监控GB28181系统/录像文件查询/录像回放/倍速播放/录像文件下载

一、前言 搞定了实时预览后&#xff0c;另一个功能就是录像回放&#xff0c;录像回放和视频点播功能完全一致&#xff0c;唯一的区别就是发送点播的sdp信息中携带了开始时间和结束时间&#xff0c;因为是录像文件&#xff0c;所以有这个时间&#xff0c;而实时视频预览这个对应…

季报中的FPGA行业:U型反转,春江水暖

上周Lattice,AMD两大厂商相继发布2025 Q1季报,尽管恢复速度各异,但同时传递出FPGA行业整体回暖的复苏信号。 5月5日,Lattice交出了“勉强及格”的答卷,报告季度营收1亿2000万,与华尔街的预期基本相符。 对于这家聚焦在中小规模器件的领先厂商而言,按照其CEO的预期,长…

嵌入式机器学习平台Edge Impulse图像分类 – 快速入门

陈拓 2025/05/08-2025/05/11 1. 简介 官方网址 https://edgeimpulse.com/ 适用于任何边缘设备的人工智能&#xff1a; Gateways - 网关 Sensors & Cameras - 传感器和摄像头 Docker Containers - Docker容器 MCUs, NPUs, CPUs, GPUs 构建数据集、训练模型并优化库以…

zst-2001 上午题-历年真题 计算机网络(16个内容)

网络设备 计算机网络 - 第1题 ac 计算机网络 - 第2题 d 计算机网络 - 第3题 集线器不能隔离广播域和冲突域&#xff0c;所以集线器就1个广播域和冲突域 交换机就是那么的炫&#xff0c;可以隔离冲突域&#xff0c;有4给冲突域&#xff0c;但不能隔离广播域&#xf…

使用termius连接腾讯云服务器

使用termius连接腾讯云服务器 1.下载termius termius官网 安装配置教程 这里安装的window版本> 默认安装到C盘&#xff0c;不建议修改路径 可以选择谷歌登录&#xff0c;也可以不登录&#xff0c;软件是免费的&#xff0c;试用的是付费版本&#xff0c;不需要点 2.配置 这里…

实景三维建模软件应用场景(众趣科技实景三维建模)

实景三维建模软件应用场景概述 实景三维建模软件&#xff0c;作为数字化时代的重要工具&#xff0c;不仅能够真实、立体、时序化地反映和表达物理世界&#xff0c;还为国家的基础设施建设和数字化发展提供了有力的支撑。 在测绘与地理信息领域&#xff0c;实景三维建模软件是构…

【Linux】基础指令(Ⅱ)

目录 1. mv指令 2. cat指令 3.echo指令 补&#xff1a;输出重定向 4. more指令 5. less指令 6. head指令和tail指令 7.date指令 时间戳&#xff1a; 8. cal指令 9. alias指令 10.grep指令 1. mv指令 语法&#xff1a;mv [选项]... 源文件/目录 目标文件/目录 …

【ios越狱包安装失败?uniapp导出ipa文件如何安装到苹果手机】苹果IOS直接安装IPA文件

问题场景&#xff1a; 提示&#xff1a;ipa是用于苹果设备安装的软件包资源 设备&#xff1a;iphone 13(未越狱) 安装包类型&#xff1a;ipa包 调试工具&#xff1a;hbuilderx 问题描述 提要&#xff1a;ios包无法安装 uniapp导出ios包无法安装 相信有小伙伴跟我一样&…

【嵌入模型与向量数据库】

目录 一、什么是向量&#xff1f; 二、为什么需要向量数据库&#xff1f; 三、向量数据库的特点 四、常见的向量数据库产品 FAISS 支持的索引类型 vs 相似度 五、常见向量相似度方法对比 六、应该用哪种 七、向量数据库的核心逻辑 &#x1f50d; 示例任务&#xff1a;…

【东枫科技】使用LabVIEW进行NVIDIA CUDA GPU 开发

文章目录 工具包 CuLab - LabVIEW 的 GPU 工具包特性和功能功能亮点类似 LabVIEW 的 GPU 代码开发支持的功能数值类型和维数开发系统要求授权售价 工具包 CuLab - LabVIEW 的 GPU 工具包 CuLab 是一款非常直观易用的 LabVIEW 工具包&#xff0c;旨在加速 Nvidia GPU 上的计算密…

基于策略的强化学习方法之策略梯度(Policy Gradient)详解

在前文中&#xff0c;我们已经深入探讨了Q-Learning、SARSA、DQN这三种基于值函数的强化学习方法。这些方法通过学习状态值函数或动作值函数来做出决策&#xff0c;从而实现智能体与环境的交互。 策略梯度是一种强化学习算法&#xff0c;它直接对策略进行建模和优化&#xff0c…