LeetCode 每日一题笔记 日期:2026.05.19 题目:2540. 最小公共值

LeetCode 每日一题笔记

0. 前言

  • 日期:2026.05.19
  • 题目:2540. 最小公共值
  • 难度:简单
  • 标签:数组、双指针、哈希表

1. 题目理解

问题描述

给定两个按非降序排序的整数数组 nums1nums2,请返回它们的最小公共整数。如果不存在公共整数,则返回 -1

示例

输入:nums1 = [1,2,3], nums2 = [2,4]

输出:2

解释:两个数组的最小公共元素是 2。
输入:nums1 = [1,2,3,6], nums2 = [2,3,4,5]

输出:2

解释:两个数组的公共元素是 2 和 3,其中 2 是较小值。

2. 解题思路

核心观察

  • 两数组已按非降序排序,可使用双指针高效遍历,类似归并排序的合并过程;
  • 利用数组的有序性,只需一次遍历即可找到第一个公共元素,即最小公共值;
  • 也可使用哈希表,但会牺牲有序性带来的性能优势,且空间复杂度更高。

算法步骤

  1. 初始化双指针 ij,分别指向 nums1nums2 的起始位置;
  2. 比较 nums1[i]nums2[j]
    • 若相等,直接返回该值(有序数组中第一个相等值即为最小值);
    • nums1[i] > nums2[j],移动 j 指针;
    • nums1[i] < nums2[j],移动 i 指针;
  3. 遍历结束未找到公共值,返回 -1

3. 代码实现

java 复制代码
package lc2540;

import java.util.HashSet;

public class Solution {
    public int getCommon(int[] nums1, int[] nums2) {
        HashSet<Integer> set = new HashSet<>();

        if (nums1.length > nums2.length) {
            for (int num : nums2) {
                set.add(num);
            }
            for (int num : nums1) {
                if (set.contains(num)) {
                    return num;
                }
            }
        } else {
            for (int num : nums1) {
                set.add(num);
            }
            for (int num : nums1) {
                if (set.contains(num)) {
                    return num;
                }
            }
        }

        return -1;
    }
}

4. 代码优化说明

减少了分支判断,直接利用双指针遍历有序数组,避免了哈希表的额外空间开销,代码更简洁高效:

java 复制代码
package lc2540;

public class Solution {
    public int getCommon(int[] nums1, int[] nums2) {
        int i = 0, j = 0;
        while (i < nums1.length && j < nums2.length) {
            if (nums1[i] == nums2[j]) {
                return nums1[i];
            }
            if (nums1[i] < nums2[j]) {
                i++;
            } else {
                j++;
            }
        }
        return -1;
    }
}

5. 复杂度分析

  • 时间复杂度 :O(n+m)O(n + m)O(n+m)
    双指针遍历两个数组,每个元素最多被访问一次。
  • 空间复杂度 :O(1)O(1)O(1)
    仅使用常数级额外空间,无哈希表等数据结构开销。

6. 总结

  • 核心思路是双指针遍历有序数组,利用数组的非降序特性直接找到第一个公共元素;
  • 优化后的双指针解法时间和空间复杂度均优于哈希表解法,是本题最优方案;
  • 关键技巧:有序数组的双指针遍历是解决此类问题的经典方法,避免了额外的空间开销和分支判断。
相关推荐
To_OC5 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
旖-旎6 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC6 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
遇乐的果园10 小时前
前端学习笔记-vue加载渲染优化
前端·笔记·学习
遇乐的果园11 小时前
前端学习笔记-vue状态管理优化
前端·笔记·学习
摇滚侠12 小时前
Java 全栈开发实战教程 课程笔记 29-33
笔记
茯苓gao13 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
whyTeaFo13 小时前
GAMES101: Lecture 9: Shading 3(Texture Mapping cont.) ppt笔记
笔记
chase。15 小时前
【学习笔记】PointWorld:迈向通用机器人操控的3D世界模型
笔记·学习·机器人
tachibana217 小时前
hot100 数组中的第K个最大元素(215)
java·数据结构·算法·leetcode