LeetCode 3740.三个相等元素之间的最小距离 I:今日先暴力,“明日“再哈希

【LetMeFly】3740.三个相等元素之间的最小距离 I:今日先暴力,"明日"再哈希

力扣题目链接:https://leetcode.cn/problems/minimum-distance-between-three-equal-elements-i/

给你一个整数数组 nums

如果满足 nums[i] == nums[j] == nums[k],且 (i, j, k) 是 3 个 不同 下标,那么三元组 (i, j, k) 被称为 有效三元组

有效三元组距离 被定义为 abs(i - j) + abs(j - k) + abs(k - i),其中 abs(x) 表示 x绝对值

返回一个整数,表示 有效三元组最小 可能距离。如果不存在 有效三元组 ,返回 -1

示例 1:
输入: nums = 1,2,1,1,3

输出: 6

解释:

最小距离对应的有效三元组是 (0, 2, 3)

(0, 2, 3) 是一个有效三元组,因为 nums[0] == nums[2] == nums[3] == 1。它的距离为 abs(0 - 2) + abs(2 - 3) + abs(3 - 0) = 2 + 1 + 3 = 6

示例 2:
输入: nums = 1,1,2,3,2,1,2

输出: 8

解释:

最小距离对应的有效三元组是 (2, 4, 6)

(2, 4, 6) 是一个有效三元组,因为 nums[2] == nums[4] == nums[6] == 2。它的距离为 abs(2 - 4) + abs(4 - 6) + abs(6 - 2) = 2 + 2 + 4 = 8

示例 3:
输入: nums = 1

输出: -1

解释:

不存在有效三元组,因此答案为 -1。

提示:

  • 1 <= n == nums.length <= 100
  • 1 <= nums[i] <= n

解题方法:暴力模拟

三层遍历,第一层使用 i i i从 0 0 0遍历到 n − 1 n-1 n−1,第二层使用 j j j从 i + 1 i+1 i+1到 n − 1 n-1 n−1遍历,第三层使用 k k k从 j + 1 j+1 j+1到 n − 1 n-1 n−1遍历。如果 n u m s i numsi numsi、 n u m s j numsj numsj、 n u m s k numsk numsk都相等,则更新答案最大值。

Tips:由于遍历过程中 i i i小于 j j j小于 k k k,所以有abs(i - j) + abs(j - k) + abs(k - i) = 2 * (k - i)

  • 时间复杂度 O ( n 3 ) O(n^3) O(n3),其中 n = l e n ( n u m s ) n=len(nums) n=len(nums)
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-04-10 23:25:26
 */
class Solution {
public:
    int minimumDistance(vector<int>& nums) {
        int ans = 201;
        for (int i = 0, n = nums.size(); i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                if (nums[j] != nums[i]) {
                    continue;
                }
                for (int k = j + 1; k < n; k++) {
                    if (nums[k] == nums[i]) {
                        ans = min(ans, 2 * (k - i));
                    }
                }
            }
        }
        return ans == 201 ? -1 : ans;
    }
};
Python
python 复制代码
'''
LastEditTime: 2026-04-11 10:31:48
'''
from typing import List

class Solution:
    def minimumDistance(self, nums: List[int]) -> int:
        ans = 201
        for i, a in enumerate(nums):
            for j in range(i + 1, len(nums)):
                if a != nums[j]:
                    continue
                for k in range(j + 1, len(nums)):
                    if a == nums[k]:
                        ans = min(ans, 2 * (k - i))
        return -1 if ans == 201 else ans

今天要是就使用哈希表了,明天就没得写了Doge
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
popcorn_min9 小时前
Digits 手写数字识别:随机森林多分类 + 像素级特征热力图
算法·随机森林·分类
liulilittle9 小时前
拥塞控制:排水终止的两种决策:OR 与 AND
网络·tcp/ip·计算机网络·算法·信息与通信·tcp·通信
weixin_3077791310 小时前
从脚本执行到智能体协作:AI辅助测试能力的范式重构
运维·开发语言·人工智能·算法·测试用例
量化君也10 小时前
从回测到全自动实盘交易,全天候策略需要经历哪些改造?
大数据·人工智能·python·算法·金融
fox_lht10 小时前
第十五章 函数式语言:迭代器和闭包
开发语言·后端·学习·算法·rust
zhengzhouliuhaha11 小时前
智能医疗设备控费系统:以全院一体化管控,筑牢医疗资源“安全阀”
大数据·数据结构·人工智能·算法·安全·机器学习·软件需求
June`11 小时前
CUDA程序效率如何计算以及工具如何使用
算法·cuda
兰令水11 小时前
leecodecode【树形DP】【2026.6.11打卡-java版本】
java·算法·深度优先
装不满的克莱因瓶11 小时前
RLHF中的PPO算法——大语言模型对齐优化的核心引擎
人工智能·python·深度学习·算法·机器学习·语言模型·自然语言处理
SWAGGY..12 小时前
Linux系统编程:(十三)环境变量
java·linux·算法