思路一:先將陣列排序完序後取k個數就完事了,基於複雜度的考慮,先使用堆排序,複雜度為o(n*logn)
思路二:可實現維持乙個k個數的大根堆,經過維持過的大根堆,就有了較小的k個數,取出即可。
具體步驟:1.可先從陣列中取k個數實現乙個大根堆,
2.遍歷原陣列,將大根堆堆頂元素和原陣列中剩餘的數進行比較,
如果此陣列中的數小於堆頂元素,將陣列的數賦值給大根堆的堆頂元素,再調整堆的順序,使其恢復為大根堆
如果此陣列中的數大於堆頂元素,什麼也不做。
分析:時間複雜度為o(n*logk)
public static arraylistgetleastnumbers_solution(int input, int k)
//將大根堆中的數和陣列剩餘的數進行比較,調整,維持大根堆,
for(int j=k;j!=input.length;j++)
swap(arr, index, largest);
index = largest;
left = 2 * index + 1;
} }public static void swap(int arr, int i, int j)
public static void main(string args) ;
arraylistgetleastnumbers_solution = getleastnumbers_solution(arr,4);
for (integer integer : getleastnumbers_solution)
}
劍指Offer 旋轉陣列中最小的數字
思路 方案一 直接遍歷陣列,找到最小的。不足以面試哦。方案二 利用二分查詢。當陣列旋轉之後比如,前半部分為遞增陣列,後半部分為遞減陣列。所以可以定義兩個指標 left和right。中間值mid left right 2 當array left rray right 時,說明旋轉陣列在 left,ri...
劍指offer 尋找陣列最小的k個數
題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,分析 傳統的做法可以是o nlog n 就是先排序然後從前面中取出k個值。高效的做法可以實現o nlogk 借助乙個容器,容量k,將陣列的讀入k個數存放在容器中,然後繼續訪問...
劍指offer 最小k個數
1.題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,2.方法 1 基於堆排序演算法,構建最大堆。時間複雜度為o nlogk 2 如果用快速排序,時間複雜度為o nlogn 3 如果用插入排序,時間複雜度為o n 2 3.演...