找出n個數中最大的m個數的一些解決辦法
方法1:
排序後直接選出,這樣時間開銷為O(NlogN)
方法2:
先用選第k大元素的方法選出第k大元素(具體可以參考選第k大元素的那篇BLOG),按Knuth的說法,時間開銷是O(n),這樣的話,如果我們找到第n-m大的元素,設其為a,然後順序掃描一遍原序列,即可以得到最大的m個數,這樣做的前提是序列中沒有重複元素。時間開銷為O(n)
方法3:
構建一個m元最小堆,然後依次比較後續元素與堆頂元素的大小,如果小,則捨棄;如果大,則修改堆頂元素為新元素,然後調整堆結構。
這樣做的時間開銷為O(mlogm+(n-m)logm),實際當中,(n-m)logm這一項的係數應該會比(n-m)小很多。
相關推薦
LeetCode:5. Longest Palindromic Substring(找出一個字串中最大的子迴文串)
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of sis 1000. Example 1: Input
找出n個數中最大的m個數的一些解決辦法
方法1: 排序後直接選出,這樣時間開銷為O(NlogN) 方法2: 先用選第k大元素的方法選出第k大元素(具體可以參考選第k大元素的那篇BLOG),按Knuth的說法,時間開銷是O(n),這樣的話,如果我們找到第n-m大的元素,設其為a,然後順序掃描一遍原序列,即可以得到最
利用最小堆找出10億個數中最大的10000個數
AS 如果 算法 最小值 分治 但是 空間 找出最大值 根節點 最小堆 最小堆是一種完全二叉樹,特點是根節點比兩個子節點都小(或者根節點比子節點都大) 過程 先找10000個數構建最小堆 依次遍歷10億個數,如果比最小堆的最小值大,則替換這個最小值,並重新構建最小堆 最後
java返回N個數中最大的前M個數
給定一個非空的整數陣列,返回其中出現頻率前 k 高的元素。 思路:將前k個數裝入佇列,向後遍歷,如果得到的數和佇列首的頻率進行比較,如果大於,則交換堆頂的元素和當前元素。直到遍歷完成 class Sol
C語言,輸入abc三個整數,並從大到小排序輸出和“找出三個數中最大的數”的中間變數的用法的區別
共同點:都是中間變數,都可以重複拿來做中轉站使用 不同點:排序的題目中,中間變數只是做中轉站作兩個變數交換值用來,並不是要用來儲存最終要輸出的值 而找出最大數或者最小數的題目中,中間變數不但做交換用的中轉站,還要儲存程式最終要輸出的值
LeetCode(Binary Tree Maximum Path Sum) 在二叉樹中找出一條和最大的路徑
題目要求: Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. For example: Given the belo
C語言 n個數中最大值
int main(){ int n,a,max,i; scanf("%d",&n); scanf("%d",&max); for(i=1;i<n;i++) { scanf("%d",&a); if(a>max)max
定義一個帶引數的巨集,求出三個數中最大的一個數
#include <iostream> using namespace std; #define MAX(a,b,c) ((a) > (b)?((a)>(c)?(a):(
(用指標方法處理)有n個整數,使前面各數順序向後移m個位置,最後m個數變成最前面m個數。編寫一個函式實現上述功能,在主函式中輸入n個整數,並輸出調整後的n個數
第一種方法:指標法 #include<stdio.h> #include<stdlib.h> int w(int *d,int e,int g) { int i,j,t; int *r; j=0; for(i=
找出無序陣列中最小的k個數(top k問題)
給定一個無序的整型陣列arr,找到其中最小的k個數 該題是網際網路面試中十分高頻的一道題,如果用普通的排序
判斷一個數中最大回文數的長度
i++ length 偶數 判斷 brush while clas stat light 判斷一個數中最大回文數的長度 :例如12332112345654321中最大的回文數是12345654321,長度為11 public static void palindrome
Problem C: 指標:有n個整數,使其前面各數順序向後移m個位置,最後m個數變成最前面m個數
#include<stdio.h> int move(int *x,int n,int m) { int t[255]; int i; //int *p;指標迴圈變數p for(i=0;i<n;i++) t[i]=x[i];
找出一個字串中最長並且不重複的子字串,要求時間複雜度越小越好
題目:找出一個字串中長度最長並且不含重複字元的子字串; 要解決這個問題有多種解法,在這裡我們來實現一種時間複雜度最小的方法,使用了雜湊值 程式碼如下:最終,時間複雜度為O(n),是用空間換時間來實現的。 //最長字元,開始位置的索引 public int startI
【126】TensorFlow 使用皮爾遜相關係數找出和標籤相關性最大的特徵值
在實際應用的時候,我們往往會收集多個維度的特徵值。然而這些特徵值未必都能派上用場。有些特徵值可能和標籤沒有什麼太大關係,而另外一些特徵值可能和標籤有很大的相關性。相關性不大的特徵值對於訓練模型沒有太大用處,還會影響效能。因此,最佳方式是找到相關性最大的幾個特
資訊學奧林匹克競賽-C語言輸出3個數中最大值
輸出3個數中最大值 #include <stdio.h> int main() { int a,b,c; scanf("%d %d %d",&a,&b,&c);
找出旋轉陣列中最小的元素
題目:把一個數組最開始的若干個元素移到陣列的末尾,我們稱之為陣列的旋轉。輸入一個遞增陣列的一個旋轉陣列,輸出旋轉陣列的最小元素,例如{3,4,5,1,2}為{1,2,3,4,5}的旋轉 分析:1.最簡單的做法就是遍歷該陣列的所有元素,比較每個元素的大小,選出最小的元素。具體
從鍵盤上輸入三個數,編寫一個max函式,可以輸出三個數中最大的數字
int max(int a,int b,int c ); int main(int argc, const char * argv[]) { int a,b,c; scanf("%d",&a); scanf("%d",&b);
尋找一個字串中的最長重複子串(字尾陣列)&找出一個字串中最長不重複子串
一、尋找一個字串中的最長重複子串(字尾陣列) 字尾陣列其實可以看尋找一個字串中的最長重複子串(字尾陣列)作一個由字串s倒數i個字元組成的子串的集合,其中0<i<s.length(),例如 字串strstr的字尾陣列為: {r,tr,str,rstr,trstr,
找出int型別的最大值
int n; for (int i = ?; ; i=i+#) { if (i < 0) break; cout << i << endl; } 到最大值,再加,會變負int,到最小值,
找出1-100中缺失的兩個數
題目:有一個數組 int array[100];本來應該存放的數為1~100,但是有兩個資料a,b丟失了,值變成了0。問如何找出丟失的那兩個數?附帶條件不能開闢額外的空間。 解題思路:常見的兩種解法有:1.計算a+b和a*b的值,然後在解方程求解(但是這樣會使得中間某個變數