zoukankan      html  css  js  c++  java
  • leetcode1539 第k个缺失的正整数

    思路1:

    暴力枚举。

    实现1:

     1 class Solution
     2 {
     3 public:
     4     int findKthPositive(vector<int>& arr, int k)
     5     {
     6         int n = arr.size();
     7         vector<int> cnt(2001, 0);
     8         for (int i = 0; i < n; i++) cnt[arr[i]] = 1;
     9         int x = 0, res = 0;
    10         for (int i = 1; i <= 2000; i++)
    11         {
    12             if (!cnt[i]) x++;
    13             if (x == k) { res = i; break; }
    14         }
    15         return res;
    16     }
    17 };

    思路2:

    根据数组中元素的数值大小和所在位置的相对关系计算答案。

    实现2:

     1 class Solution
     2 {
     3 public:
     4     int findKthPositive(vector<int>& arr, int k)
     5     {
     6         if (arr[0] > k) return k;
     7         int cnt = arr[0] - 1, n = arr.size();
     8         for (int i = 0; i < n - 1; i++)
     9         {
    10             int d = arr[i + 1] - arr[i] - 1;
    11             if (cnt + d >= k) return arr[i] + k - cnt;
    12             cnt += d;
    13         }
    14         return arr[n - 1] + k - cnt;
    15     }
    16 };

    思路3:

    在思路2的基础上更进一步,使用二分查找。

    实现3:

     1 class Solution
     2 {
     3 public:
     4     int cnt(vector<int>& arr, int m)
     5     {
     6         return arr[m] - m - 1;
     7     }
     8     int findKthPositive(vector<int>& arr, int k)
     9     {
    10         int n = arr.size();
    11         int tmp = arr[n - 1] - n;
    12         if (tmp < k) return arr[n - 1] + k - tmp;
    13         int l = 0, r = n - 1, p = -1;
    14         while (l <= r)
    15         {
    16             int m = l + r >> 1;
    17             if (arr[m] - m - 1 < k) l = m + 1;
    18             else
    19             {
    20                 p = m; r = m - 1;
    21             }
    22         }
    23         tmp = arr[p] - p - 1;
    24         return arr[p] + k - tmp - 1;
    25     }
    26 };
  • 相关阅读:
    hdu 5119 Happy Matt Friends
    hdu 5128 The E-pang Palace
    hdu 5131 Song Jiang's rank list
    hdu 5135 Little Zu Chongzhi's Triangles
    hdu 5137 How Many Maos Does the Guanxi Worth
    hdu 5122 K.Bro Sorting
    Human Gene Functions
    Palindrome(最长公共子序列)
    A Simple problem
    Alignment ( 最长上升(下降)子序列 )
  • 原文地址:https://www.cnblogs.com/wangyiming/p/14403704.html
Copyright © 2011-2022 走看看