1、輸入n個整數,輸出其中最小的k個。
思路1:先快速排序,然後取前k個數。時間複雜度:o(n * log n)+o(k)=o(n * log n)。
思路2:a)定義乙個長度為k的陣列result,將前k個整數放入result;
b)採用選擇或交換排序找到result陣列的最大值max;
c)依次遍歷後n-k個整數,若其》max,說明其不是最小k個數之一並跳過,若其
這種演算法最差情況下的時間複雜度:o(k)+(n-k)*o(k)=o(n*k)
思路3:a)選擇乙個數pivot將陣列分成兩部分sa和sb,使得sa的元素都小於等於pivot,sb的元素都大於pivot;
b)如果k
c)如果k=sa元素個數,則sa中元素就是最小的k個元素,
d)如果k>sa元素個數,則返回sa中所有元素和sb中(k-|sa|)個元素,即遞迴sb。
這種平均時間複雜度:o(n*logk),二分法!
思路1**如下:
public class codefour;
mysort(num,0,num.length-1);
int k = 3;
for(int i=0;iarr[right])
swap(arr,left,right);
return;
} int i = left;
int j = right;
int pivot = arr[i];
while(leftpivot&&left
思路2**如下:
public class codethree;
int k = 3;
mink(arr,k);
} public static void mink(int arr, int k)
} public static void swap(int arr, int index1, int index2)
}
思路3**如下:
public class codeone;
int k = 3;
mink2(arr,0,arr.length-1,k);
} public static void mink2(int arr, int left, int right,int k)if(i-left+1
2、兩個公升序序列a=(a1,...,ak)和b=(b1,...,bk),求k個最小的(ai+bj),其中1
思路1:兩個陣列相加得到k*k個數,轉變成求新陣列的k個最小值的問題;
時間複雜度:o(k*k)+(k*k)*o(k)=o(k*k*k)
思路2:a)找到最小的整數n,滿足n*(n+1)/2>=k;
b)若n*(n+1)/2=k,則滿足 i+j<=n 的n*(n+1)/2個數(arr1[i]+arr2[j])即為所求,輸出結果程式結束;
c)若n*(n+1)/2>k,則滿足 i+j<=n-1 的
(n-1)*n/2個數屬於所求,另外(
k-(n-1)*n/2
)個結果在
滿足 i+j=n 的
n個數中;
d)求滿足 i+j=n 的
n個數中最小的(
k-(n-1)*n/2
)個數,即上文題1
。採用快速排序方法下的時間複雜度:o(sqrt(k))+o(sqrt(k) * logsqrt(k))= o(sqrt(k)* log
sqrt(k))
對上述演算法解釋一下,因為
自己想到的,好得意,啊哈哈~歡迎打臉~~~
a、b兩個陣列中數兩兩相加可得k*k個數,形成乙個新的二維陣列 c[i, j] =a[i] +b[j],要求的就是陣列 c 中的k個最小值。因為陣列a、b是公升序序列,則一定有c[i, j]<=c[m, n],其中m+n>i+j。
以a=、b=為例,k=5,滿足n*(n+1)/2>=k的最小正整數為n=3,則最小的k個數一定在i+j
從上圖可以看出,在不計算陣列c中元素值的情況下,僅憑索引號可知越靠近左上角值越小,處於同一45°直線上(圖中以同一顏色標出)元素之間的大小必須通過計算才能得知。k個最小數也都在左上角,k=5,n=3,則屬於 i+j(n-1)*n/2個數一定屬於k個最小數,剩下的數都在滿足i+j = n-1的直線上,因此僅需要對該直線上的元素判斷即可。
思路2**如下:
public static void myfun(int arr1, int arr2, int k){
int n=1;
while(n*(n+1)/2
其他思路:最小堆(輔助陣列(
演算法學習 6
計數排序是假設陣列a中的元素都是在0到k區間內的整數。構建乙個陣列c 0,k 初始化為 1,如果陣列a中的元素互異的話,那麼把a的元素拷貝到c中 c a i a i 然後遍歷c,把非 1的元素依次拷貝到陣列a中即可完成排序。但陣列有元素相等要怎麼處理了。元素互異的做法,還可以是c 0,k 初始化為0...
k 鄰近演算法學習
coding utf 8 from numpy import import operator def createdataset group array 1.0,1.1 1.0,1.0 0,0 0,0.1 labels a b c d return group,labels def classify...
K 近鄰演算法學習
coding utf 8 from numpy import import operator def createdataset group array 1.0,1.1 1.0,1.0 0,0 0,0.1 labels a a b b return group,labels def classify...