• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

RomanLin

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【随机双模数哈希】LeetCode 3934. 最短唯一子数组

题目

https://leetcode.cn/problems/smallest-unique-subarray/description/

参考代码

struct Hash {
    static constexpr long long MOD1 = 1e9 + 7, MOD2 = 1e9 + 9;
    long long base1, base2;
    vector<long long> hash1, hash2, pow1, pow2;
    int n;

    static long long getRandomBase(long long lo, long long hi) {
        static mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
        uniform_int_distribution<long long> dist(lo, hi);
        return dist(rng);
    }

    Hash(vector<int>& nums) {
        base1 = getRandomBase(1e5 + 1, 1e9);
        base2 = getRandomBase(1e5 + 1, 1e9);
        init(nums);
    }

    void init(vector<int>& nums) {
        n = nums.size();
        hash1.resize(n + 1);
        hash2.resize(n + 1);
        pow1.resize(n + 1);
        pow2.resize(n + 1);
        pow1[0] = pow2[0] = 1;
        for (int i = 1; i <= n; ++ i) {
            pow1[i] = pow1[i - 1] * base1 % MOD1;
            pow2[i] = pow2[i - 1] * base2 % MOD2;
        }
        for (int i = 0; i < n; ++ i) {
            hash1[i + 1] = (hash1[i] * base1 + nums[i]) % MOD1;
            hash2[i + 1] = (hash2[i] * base2 + nums[i]) % MOD2;
        }
    }

    pair<long long, long long> getHash(int l, int r) {//[l, r],下标要从 1 开始
        long long h1 = (hash1[r + 1] - hash1[l] * pow1[r - l + 1] % MOD1 + MOD1) % MOD1;
        long long h2 = (hash2[r + 1] - hash2[l] * pow2[r - l + 1] % MOD2 + MOD2) % MOD2;
        return {h1, h2};
    }
};

class Solution {
public:
    int smallestUniqueSubarray(vector<int>& nums) {
        int n = nums.size();
        Hash hash(nums);
        int l = 1, r = n, m;
        auto check = [&](int len) -> bool {
            map<pair<long long, long long>, int> mp;
            for (int i = len - 1; i < n; ++ i) {
                auto h = hash.getHash(i - len + 1, i);
                mp[h] ++;
            }
            for (auto &[_, v]: mp) {
                if (v == 1) return false;
            }
            return true;
        };
        while (l < r) {
            m = l + r >> 1;
            if (check(m)) l = m + 1;
            else r = m;
        }
        return l;
    }
};

posted on 2026-05-22 00:48  RomanLin  阅读(2)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3