Advertisement
Guest User

Untitled

a guest
Dec 15th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 KB | None | 0 0
  1. /*  Задан массив целых чисел (тип int). Нужно найти, если ли в массиве такое число, что количество чисел меньших данного числа равно заданному числу. Искомое число должно быть максимальным.
  2. Примеры:
  3. [1,1,1,3] - ответ 3 (ровно 3 числа меньше трех)
  4. [1,3,1,1] - ответ 3
  5. [0,3,1,2] - ответ 3 (одно число меньше единицы, два числа меньше двойки и три числа меньше тройки, но тройка максимальная из них, поэтому ответ три)
  6. [12,1,6] - ответ 0
  7. [1] - ответ 0
  8. [1,1] - ответ 0
  9. */
  10.  
  11. #include <functional>
  12. #include <algorithm>
  13. #include <vector>
  14. #include <set>
  15.  
  16. #include <cassert>
  17.  
  18.  
  19. namespace SimpleSolution
  20. {
  21.     int32_t run(std::vector<int32_t> v)
  22.     {
  23.         if (v.size() < 2)
  24.         {
  25.             return 0;
  26.         }
  27.  
  28.         std::sort(v.begin(), v.end());
  29.  
  30.         for (auto index = v.size() - 1; index > 0; --index)
  31.         {
  32.             if (v[index] == index && v[index - 1] != index)
  33.             {
  34.                 return v[index];
  35.             }
  36.         }
  37.  
  38.         return 0;
  39.     }
  40. }
  41.  
  42. namespace BinaryHeapSolution
  43. {
  44.     int32_t run(std::vector<int32_t> v)
  45.     {
  46.         if (v.size() < 2)
  47.         {
  48.             return 0;
  49.         }
  50.  
  51.         std::make_heap(v.begin(), v.end());
  52.  
  53.         while (v.size() > 2)
  54.         {
  55.             if (v[0] == v.size() - 1 && v[0] != v[1] && v[0] != v[2])
  56.             {
  57.                 return v[0];
  58.             }
  59.             std::pop_heap(v.begin(), v.end());
  60.             v.pop_back();
  61.         }
  62.  
  63.         if ((v[0] != v[1]) && (v[0] == 1 || v[1] == 1)) return 1;
  64.  
  65.         return 0;
  66.     }
  67. }
  68.  
  69. namespace MultisetSolution
  70. {
  71.     int32_t run(const std::vector<int32_t>& values)
  72.     {
  73.         // O(n*log(n))
  74.         std::multiset<int32_t, std::greater<int32_t>> sortValues(values.cbegin(), values.cend());
  75.  
  76.         // O(n)
  77.         int prevElemCount = sortValues.size() - 1;
  78.         for (auto it = sortValues.begin(); it != sortValues.end(); ++it, --prevElemCount)
  79.         {
  80.             auto isLast(prevElemCount == 0);
  81.             auto nextIt = std::next(it);
  82.             if (*it == prevElemCount && (isLast || *it != *nextIt))
  83.             {
  84.                 return *it;
  85.             }
  86.         }
  87.         return 0;
  88.     }
  89. };
  90.  
  91. namespace IndexOrientedSolution
  92. {
  93.     int32_t run(const std::vector<int32_t>& values)
  94.     {
  95.         if (values.empty())
  96.         {
  97.             return 0;
  98.         }
  99.  
  100.         auto size(values.size());
  101.         auto totalCount(size);
  102.         std::vector<int32_t> valueCounts(size);
  103.         // O(n)
  104.         for (auto val : values)
  105.         {
  106.             if (val < 0 || val < size)
  107.             {
  108.                 val = val < 0 ? 0 : val;
  109.                 ++valueCounts[val];
  110.             }
  111.             else
  112.             {
  113.                 --totalCount;
  114.             }
  115.         }
  116.  
  117.         // O(n)
  118.         for (auto i = valueCounts.size() - 1; i > 0; --i)
  119.         {
  120.             if (valueCounts[i] > 0)
  121.             {
  122.                 totalCount -= valueCounts[i];
  123.                 if (i == totalCount)
  124.                 {
  125.                     return i;
  126.                 }
  127.             }
  128.         }
  129.         return 0;
  130.     }
  131. };
  132.  
  133.  
  134. int main()
  135. {
  136.     std::vector<std::vector<int32_t>> testValues = {
  137.         { 4, 5, 3, 3, 3, 3, 3, 7, 7 },
  138.         { 5, -1, 4, 7, -1, 4, 17, 6, 1, 3 },
  139.         { -1 },
  140.         { 0 },
  141.         { -4, -3, -2, -1, 5, 5, 5, -1 },
  142.         { 1, 1, 1, 1, 1 },
  143.         { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 },
  144.         { 17, 17, 17 }
  145.     };
  146.  
  147.     std::vector<int32_t> testResults = { 7, 4, 0, 0, 5, 0, 10, 0 };
  148.  
  149.     for (auto i = 0; i < testValues.size(); ++i)
  150.     {
  151.         auto s_v = SimpleSolution::run(testValues[i]);
  152.         assert(s_v == testResults[i]);
  153.         auto m_v = MultisetSolution::run(testValues[i]);
  154.         assert(m_v == testResults[i]);
  155.         auto b_v = BinaryHeapSolution::run(testValues[i]);
  156.         assert(b_v == testResults[i]);
  157.         auto i_v = IndexOrientedSolution::run(testValues[i]);
  158.         assert(i_v == testResults[i]);
  159.     }
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement