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

RomanLin

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

公告

View Post

【枚举右,维护左】LeetCode 3404. 统计特殊子序列的数目

题目

前置题目:https://leetcode.cn/problems/number-of-good-pairs/description/
当前题目:https://leetcode.cn/problems/count-special-subsequences/description/

题解

将 \(nums[p] * nums[r] = nums[r] * nums[s]\) 变形为 \(\frac{nums[p]}{nums[q]} = \frac{nums[s]}{nums[r]}\)。

枚举 \(r\),在每次 \(r\) 右移一位的时候,仅需要用 map 维护 \(q = r - 2\) 情况下的 \(\frac{nums[p]}{nums[q]}\) 值,这步操作的总体时间复杂度是 \(O(n^2)\);并在移动之后枚举 \(\frac{nums[s]}{nums[r]}\) 在 map 中出现的次数,这步操作的时间复杂度是 \(O(n^2logn)\)。

参考代码

class Solution {
public:
    long long numberOfSubsequences(vector<int>& nums) {
        long long ans = 0LL;
        int n = nums.size();
        map<double, int> mp;
        for (int i = 4; i < n; ++ i) {
            for (int j = i - 4; j >= 0; -- j) {
                mp[1.0 * nums[j] / nums[i - 2]] ++;
            }
            for (int j = i + 2; j < n; ++ j) {
                ans += mp[1.0 * nums[j] / nums[i]];
            }
        }
        return ans;
    }
};

posted on 2025-01-01 11:13  RomanLin  阅读(34)  评论(0)    收藏  举报

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