zoukankan      html  css  js  c++  java
  • leetcode786 第 K 个最小的素数分数

    思路:

    二分。

    实现:

     1 class Solution
     2 {
     3 public:
     4     bool check(double x, vector<int>& arr, int k)
     5     {
     6         int slow = 0, n = arr.size(), ans = 0;
     7         for (int i = 1; i < n; i++)
     8         {
     9             if (arr[slow] > x * arr[i]) continue;
    10             int tmp = slow;
    11             while (slow < i and arr[slow] <= x * arr[i]) slow++;
    12             ans += (slow - tmp) * (n - i);
    13         }
    14         return ans >= k;
    15     }
    16     vector<int> kthSmallestPrimeFraction(vector<int>& arr, int k)
    17     {
    18         int n = arr.size();
    19         double l = 0, r = 1, res = -1;
    20         for (int i = 0; i < 30; i++)
    21         {
    22             double m = (l + r) / 2;
    23             if (check(m, arr, k))
    24             {
    25                 res = m; r = m;
    26             }
    27             else l = m;
    28         }
    29         double minn = 0x3f3f3f3f;
    30         int a = -1, b = -1;
    31         for (int i = 0; i < n; i++)
    32         {
    33             double x = res * arr[i];
    34             int p = upper_bound(arr.begin(), arr.begin() + i, x) - arr.begin();
    35             if (p)
    36             {
    37                 p--;
    38                 double tmp = (double)arr[p] / arr[i];
    39                 if (abs(res - tmp) < minn)
    40                 {
    41                     minn = abs(res - tmp);
    42                     a = p; b = i;
    43                 }
    44             }
    45         }
    46         return vector<int>{arr[a], arr[b]};
    47     }
    48 };
  • 相关阅读:
    Markdown学习
    二叉树的最近公共祖先
    javaCompiler简析
    自定义类加载器
    聚合和组合的区别
    拓扑排序
    C++ map和unordered_map
    静态文件加载路径
    文件上传
    jackson
  • 原文地址:https://www.cnblogs.com/wangyiming/p/15112230.html
Copyright © 2011-2022 走看看