最小的 k 个数

 

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

 

示例 1:

输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]

示例 2:

输入:arr = [0,1,2,1], k = 1
输出:[0]

 

限制:

  • 0 <= k <= arr.length <= 10000
  • 0 <= arr[i] <= 10000

1、冒泡和快排

#include <vector>

using namespace std;

template<class T>
struct lessThan_default {
    bool operator()(T x, T y) {
        return x > y;
    }
};

class Solution {
public:

    void bubbleSort(vector<int>::iterator arr, int size, lessThan_default<int> lt) {
        int i, j, best_i;
        for (i = 0; i < size - 1; ++i) {
            best_i = i;
            for (j = i + 1; j < size; ++j)
                if (lt(arr[best_i], arr[j]))
                    best_i = j;
            swap(arr[best_i], arr[i]);
        }
    }

    void bubbleSort_(vector<int>::iterator arr, int size) {
        bubbleSort(arr, size, lessThan_default<int>());
    }

    void sort(vector<int>::iterator arr, int size, lessThan_default<int> lt) {
        if (size <= 15)
            bubbleSort(arr, size, lt);
        else {
            int pivot = arr[(size / 2)];
            int i = -1;
            int j = size;
            for (;;) {
                do i++; while (lt(pivot, arr[i]));
                do j--; while (lt(arr[j], pivot));
                if (i >= j)
                    break;
                swap(arr[i], arr[j]);
            }
            sort(arr, i, lt);
            sort(arr + i, size - i, lt);
        }
    }

    vector<int> getLeastNumbers(vector<int> &arr, int k) {
        int size = arr.size();
        sort(arr.begin(), size, lessThan_default<int>());
        vector<int> selectionNumber;
        int o = 0;
        while (k--) {
            selectionNumber.push_back(arr[o]);
            o++;
        }
        return selectionNumber;
    }
};

int main() {
    vector<int> a{0, 0, 2, 0, 4, 2, 4, 0, 7, 3, 2, 10, 7, 9, 10, 4, 1, 4, 2, 10, 3, 16, 8, 22, 18, 10, 6, 16, 8, 2, 28,
                  24, 24, 27, 2, 28, 34, 35, 7, 29, 31, 16, 25, 9, 0, 21, 38, 33, 16, 11, 2, 16, 37, 28, 19, 45, 29, 8,
                  2, 26, 24, 12, 36, 29, 31, 40, 10, 59, 20, 64, 60, 45, 4, 40, 49, 66, 59, 64, 66, 70, 76, 16, 18, 8,
                  73, 66, 46, 63, 67, 43, 3, 75, 33, 46, 80, 51, 75, 84, 6, 96, 33, 12, 60, 52, 62, 84, 100, 39, 64, 74,
                  87, 25, 61, 37, 21, 40, 44, 87, 2, 23, 3, 116, 6, 122, 71, 1, 66, 75, 110, 87, 103, 44, 109, 81, 82,
                  25, 133, 4, 85, 45, 34, 111, 57, 53, 41, 62, 29, 94, 125, 4, 54, 95, 88, 136, 61, 15, 121, 15, 144,
                  132, 14, 136, 103, 34, 158, 134, 121, 15, 136, 56, 128, 95, 133, 25, 91, 168, 4, 88, 137, 143, 23,
                  111, 93, 139, 182, 81, 105, 60, 93, 39, 37, 91, 186, 138, 162, 58, 105, 125, 144, 171, 122, 30, 143,
                  32, 132, 123, 57, 31, 188, 150, 91, 1, 190, 57, 86, 166, 3, 77, 145, 48, 86, 189, 79, 204, 147, 124,
                  207, 3, 138, 17, 37, 212, 192, 137, 51, 188, 85, 63, 144, 210, 9, 187, 62, 74, 131, 49, 176, 190, 134,
                  215, 215, 143, 22, 219, 116, 199, 43, 19, 149, 106, 186, 84, 257, 167, 69, 26, 207, 91, 11, 154, 128,
                  206, 65, 184, 207, 165, 225, 218, 196, 199, 190, 134, 238, 268, 34, 270, 70, 166, 128, 121, 180, 50,
                  259, 64, 7, 100, 167, 8, 208, 96, 73, 140, 158, 109, 245, 40, 118, 164, 42, 221, 171, 20, 261, 229,
                  230, 295, 190, 151, 130, 286, 82, 103, 117, 148, 180, 15, 55, 111, 58, 247, 277, 76, 317, 13, 326, 78,
                  138, 207, 95, 54, 273, 185, 21, 250, 24, 327, 48, 345, 160, 253, 132, 345, 71, 150, 51, 187, 11, 237,
                  51, 130, 286, 126, 220, 224, 227, 192, 113, 268, 20, 20, 357, 37, 153, 41, 217, 12, 8, 153, 314, 288,
                  217, 304, 88, 230, 238, 16, 9, 248, 375, 350, 27, 70, 156, 108, 384, 73, 213, 245, 385, 252, 83, 188,
                  201, 64, 65, 290, 370, 48, 21, 116, 390, 149, 71, 36, 190, 186, 126, 249, 90, 191, 238, 82, 26, 387,
                  345, 318, 226, 58, 134, 283, 320, 90, 28, 318, 356, 257, 244, 219, 417, 116, 195, 77, 199, 172, 408,
                  297, 37, 270, 435, 342, 171, 339, 80, 36, 233, 85, 264, 153, 354, 95, 309, 62, 347, 173, 152, 348,
                  372, 322, 268, 261, 104, 197, 370, 90, 181, 76, 428, 296, 354, 136, 83, 138, 169, 195, 375, 121, 59,
                  376, 3, 294, 328, 401, 135, 470, 50, 103, 383, 30, 3, 436, 11, 101, 188, 218, 138, 135, 125, 296, 229,
                  451, 342, 328, 29, 254, 366, 507, 68, 339, 260, 69, 468, 49, 84, 132, 509, 473, 65, 127, 226, 321,
                  110, 33, 367, 452, 340, 449, 508, 324, 237, 21, 367, 80, 356, 262, 24, 253, 335, 60, 88, 11, 471, 73,
                  42, 403, 349, 19, 72, 150, 231, 343, 311, 243, 362, 465, 191, 267, 341, 429, 399, 411, 272, 145, 267,
                  507, 501, 140, 496, 227, 236, 39, 56, 472, 151, 325, 387, 93, 106, 469, 299, 121, 278, 564, 412, 134,
                  512, 294, 546, 454, 300, 258, 395, 480, 82, 584, 190, 289, 311, 580, 493, 427, 499, 251, 490, 565,
                  404, 189, 136, 283, 224, 611, 247, 14, 261, 605, 239, 171, 296, 511, 540, 335, 394, 201, 164, 416,
                  334, 16, 328, 61, 609, 222, 288, 86, 589, 497, 1, 49, 310, 187, 212, 292, 493, 88, 178, 395, 58, 286,
                  490, 169, 46, 451, 200, 475, 149, 404, 179, 279, 194, 195, 441, 654, 9, 225, 289, 213, 27, 492, 643,
                  216, 596, 477, 503, 328, 618, 166, 170, 192, 122, 9, 618, 100, 136, 528, 595, 153, 462, 567, 97, 182,
                  567, 135, 660, 664, 700, 478, 696, 361, 63, 30, 682, 241, 578, 21, 49, 650, 635, 663, 181, 374, 553,
                  470, 420, 617, 49, 558, 485, 472, 14, 318, 315, 466, 512, 256, 197, 674, 463, 315, 80, 427, 36, 350,
                  383, 356, 109, 317, 323, 614, 180, 609, 250, 636, 684, 598, 536, 384, 521, 214, 223, 690, 340, 599,
                  730, 595, 748, 92, 213, 573, 654, 177, 114, 732, 741, 390, 464, 109, 436, 319, 520, 178, 555, 645,
                  603, 726, 499, 214, 405, 150, 724, 187, 8, 159, 679, 164, 30, 738, 437, 138, 301, 700, 455, 125, 363,
                  195, 712, 492, 366, 484, 283, 794, 802, 416, 343, 472, 610, 590, 509, 429, 299, 537, 448, 545, 372,
                  608, 483, 481, 780, 207, 317, 805, 366, 155, 635, 723, 273, 558, 511, 586, 430, 420, 783, 364, 35,
                  753, 435, 381, 150, 711, 689, 198, 836, 347, 399, 827, 830, 116, 328, 52, 462, 119, 688, 194, 279,
                  266, 641, 85, 184, 56, 112, 815, 855, 551, 145, 101, 432, 358, 384, 760, 694, 336, 307, 306, 832, 130,
                  370, 345, 373, 640, 644, 523, 483, 751, 177, 705, 592, 347, 310, 137, 232, 386, 603, 458, 450, 702,
                  759, 185, 578, 604, 302, 776, 305, 272, 356, 444, 405, 677, 113, 249, 913, 59, 903, 500, 63, 159, 22,
                  425, 185, 447, 412, 94, 264, 397, 108, 122, 786, 758, 81, 787, 737, 379, 469, 382, 918, 470, 706, 291,
                  358, 622, 519, 220, 881, 790, 254, 310, 729, 862, 379, 504, 894, 14, 931, 317, 751, 944, 494, 369,
                  220, 285, 427, 572, 691, 225, 845, 940, 194, 712, 87, 16, 22, 271, 461, 712, 232, 259, 900, 961, 110,
                  5, 711, 50, 135, 60, 948, 588, 242, 440, 819, 276, 982, 548, 523, 551};
    Solution s;
    s.getLeastNumbers(a, 212);
}

 

posted on 2021-03-10 11:13  QzZq  阅读(89)  评论(0)    收藏  举报

导航