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. 总结

  • 核心思路是双指针遍历有序数组,利用数组的非降序特性直接找到第一个公共元素;
  • 优化后的双指针解法时间和空间复杂度均优于哈希表解法,是本题最优方案;
  • 关键技巧:有序数组的双指针遍历是解决此类问题的经典方法,避免了额外的空间开销和分支判断。
相关推荐
M78佐菲5 小时前
ARM学习笔记(1)
linux·arm开发·笔记·嵌入式硬件·学习
益达丫6 小时前
Socket编程揭秘:端口、IP与进程通信的底层逻辑
linux·笔记
马可家的菠萝11 小时前
你收藏的资料,有多少真的被你第二次打开过?
笔记·知识管理·效率提升·个人知识库
Tisfy12 小时前
LeetCode 3498.字符串的反转度:一次遍历
leetcode·字符串·题解·遍历
a1879272183112 小时前
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流
算法·leetcode·二叉树··bfs·算法讲解·树遍历
miller-tsunami12 小时前
排序的相关知识点
数据结构·排序算法
小刘在重生~12 小时前
Java Lock 显式锁案例|ReentrantLock 解决多线程安全问题(超详细实战)
java·笔记·面试
职豚求职小程序12 小时前
中国人寿27秋招笔试[特殊字符]北森机考|备考攻略
笔记
江湖人称菠萝包12 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter9-Qt Charts
笔记·qt·qt5
乐橙开放平台12 小时前
从「多套客户端」到一套开放能力:乐橙视频监控能力复盘
笔记·物联网·自动化·音视频·智能家居