最小的 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 <= 100000 <= 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); }
浙公网安备 33010602011771号