輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
public arraylistgetleastnumbers_solution(int input, int k)
int start = 0;
int end = input.length-1;
intindex = partition(input, start, end);
//一直迴圈知道找到第k個位置正確的數。
while (index != k - 1) else
}for (int i = 0; i < k; i++)
return res;
}static
int partition(int input, int start, int end)
input[start] = input[end];
while (start < end && tmp >= input[start])
input[end] = input[start];
}input[start] = tmp;
return start;
}
//堆排序:構建堆,不斷調整的過程,從最後乙個不是葉子節點的節點開始。
static
public arraylistgetleastnumbers_solution1(int input, int k)
int maxheap = new
int[k];
//初始化堆
for (int i = 0; i < maxheap.length; i++)
//將初始化的堆調整為最大堆
for (int i = (maxheap.length-1)/2; i >=0 ; i--)
//遍歷初始陣列不斷調整最大堆
for (int i = k; i if (maxheap[0]>input[i])
}for (int i = 0; i < maxheap.length; i++)
return res;
}static
void adjustheap(int maxheap,int i)
if (rchildindex]index = rchild;
}if (i!=index)
}
優缺點:
思路1優點:節省空降,時間複雜度平均為o(n)
缺點:需要修改原始陣列
思路2優點:不用修改原始陣列,適合海量資料
缺點:時間複雜度略高o(nlogk)
查詢陣列中最小k個數
思路 可採用大頂堆來實現 維護乙個規模為k的大頂堆。從前往後掃瞄陣列元素 若大頂堆的size小於k,則把當前元素插入大頂堆中 若小於k,若當前元素小於堆頂元素,則刪除堆頂元素,插入當前元素。考慮到從頭實現乙個大頂堆比較麻煩,這裡使用treeset容器,它提供有序的set。treeset底層實際使用的...
找出陣列中最小的k個數
leetcode 面試題40.最小的k個數 快速排序,時間複雜度為nlogn,然後前k個元素就是最小的k個數 class solution 原理也是快速排序的原理,只不過增加了停止條件。不用完全排序而已。class solution int label quicksort arr,0,arr.len...
劍指 Offer 40 最小的k個數 快排 堆
劍指 offer 40.最小的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...