日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python要求O(n)復雜度求無序列表中第K的大元素實例

瀏覽:82日期:2022-07-31 10:32:11

昨天面試上來就是一個算法,平時基本的算法還行,結果變個法就不會了。。。感覺應該刷一波Leecode冷靜下。。。今天抽空看下。

題目就是要求O(n)復雜度求無序列表中第K的大元素

如果沒有復雜度的限制很簡單。。。加了O(n)復雜度確實有點蒙

雖然當時面試官說思路對了,但是還是沒搞出來,最后面試官提示用快排的思想

主要還是設立一個flag,列表中小于flag的組成左列表,大于等于flag的組成右列表,主要是不需要在對兩側列表在進行排序了,只需要生成左右列表就行,所以可以實現復雜度O(n)。

舉個例子說明下步驟,比如有列表test_list=[6,5,4,3,2,1],找出第3大的元素,就是4,

如果flag=4:

l_list=[3,2,1]

r_list=[6,5]

因為第3大的元素,r_list長度為2,自然flag就是第3大的元素了,return flag,len(r_list)==k-1,就是結束遞歸的基線條件。

如果flag=1:

l_list=[]

r_list=[6,5,4,3,2]

問題就變成了求r_list里面第K大的元素了

如果flag=6:

l_list=[5,4,3,2,1]

r_list=[]

相當于求l_list里第k-(len(test_list)-len(r_list)+1)大的元素了,這里就是相當于求l_list=[5,4,3,2,1]第2大的元素

通過這三種情況進行遞歸,最終返回flag就是目標元素

最差復雜度就是n+n-1+n-2+n-3+......+1=(1+n)n/2,就是O(n²)

當時我就會回答出了最差復雜度肯定是n²啊,面試小哥說平均復雜度,我說計算平均復雜度好像很復雜吧?感覺他也有點蒙,就說每次都是二分的情況的復雜度,

當時竟然回答了個logn*logn。。。最后還是被面試管提示的。。。太尷尬了。。。

實際上如果每次剛好二分,第一次取flag比較次數是n,第二次是n/2,依次下去是n/4,n/8.....n/2

就是n+n/2+n/4....

最最丟人的是計算這個結果還想了一會。。。看樣該做點高中上數學了。。。

實際結果自然是n(1+1/2+1/4+1/8+....1/2ⁿ)=2n,復雜度自然就是O(n)了

最后實現代碼如下:

#給定一個無序列表,求出第K大的元素,要求復雜度O(n)def find_k(test_list,k): flag=test_list[0] test_list.pop(0) l_list=[i for i in test_list if i < flag] r_list=[i for i in test_list if i >= flag] #結果遞歸的基線條件 if len(r_list)==k-1: return flag elif len(r_list)>k-1: return find_k(r_list,k) else: #因為test_list.pop(0)讓test_list少了一個元素,所以下面需要+1 gap=len(test_list)-len(l_list)+1 k=k-gap return find_k(l_list,k) if __name__ == ’__main__’: test_list = [5, 4, 3, 2, 1,10,20,100] res=find_k(test_list,1) print(res)

補充知識:從N個數選取k個數的組合--不降原則(DFS)

原理 :不降原則(看代碼前先看一下原理吧)

舉個例子:

比如說在6里面隨便選5個數,那么選法都是什么呢?

瞎枚舉?

1234512346

前兩個還不會弄混

然后很可能就亂了

少點數可能不會亂

但是多了就不好整了

比如說在100里隨便選50個數。

1 2 3 4 5 6 7 8 9 10 11 12…

所以我們可以運用不降原則:

保證枚舉的這些數是升序排列

其實真正的不降原則還可以平

比如 1 2 2 3 3 4…

但是這里要說的“不降原則”不能平哦!

對于這道題也不能平

否則就有重復數字了

拿6個里面選3個舉例子

1 2 31 2 41 2 51 2 6

第一輪枚舉完畢。

第二個數加一

1 3 ?

這個“?”應該是4,因為是升序排列

1 3 41 3 51 3 6

接著,就是這樣

1 4 51 4 61 5 6

第一位是1枚舉完畢

第一位是2呢?

2 3 42 3 52 3 62 4 52 4 62 5 6

就是這樣的,枚舉十分清晰,對嗎?

以此類推…

3 4 53 4 63 5 64 5 6

然后就枚舉不了了,結束。

所以說,這樣就可以避免判重了。

代碼

#include<iostream>#include<cstring>using namespace std;int n,k; //全局變量:從n個數的集合中選取k個數int a[25]; //存放n個數的集合數據int vis[25];//在dfs中記錄數據是否被訪問過int re[25];//存放被選取的數字void dfs(int step,int start)//參數step代表選取第幾個數字,參數start代表從集合的第幾個開始選{ if(step==k)//如果選夠了k個就輸出 { for(int i=0;i<k;i++) { cout<<re[i]<<' '; } cout<<endl; } for(int i=start;i<n;i++)//不降原則的核心步驟1:從第i+1個開始選取數字(避免重選) { if(vis[i]==1) continue; vis[i]=1; re[step]=a[i]; dfs(step+1,i+1); //不降原則的核心步驟2:從第i+1個開始選取數字(避免重選) vis[i]=0; } return;}int main(){ while(cin>>n>>k) { memset(a,0,sizeof(a)); memset(re,0,sizeof(re)); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { cin>>a[i]; } dfs(0,0); } return 0;}

運行結果

Python要求O(n)復雜度求無序列表中第K的大元素實例

變形——從N個數中選取k個數求和(舉一反三)

代碼

#include<iostream>#include<cstring>using namespace std;int n,k; //全局變量:從n個數的集合中選取k個數int a[25]; //存放n個數的集合數據int vis[25];//在dfs中記錄數據是否被訪問過int re[25];//存放被選取的數字void dfs(int step,int sum,int start)//參數step代表選取第幾個數字,參數sum代表從選取前step-1個數時的總數,參數start代表從集合的第幾個開始選{ if(step==k)//如果選夠了k個就輸出 { cout<<re[0]; for(int i=1;i<k;i++) { cout<<’+’<<re[i]; } cout<<’=’<<sum<<endl; } for(int i=start;i<n;i++)//不降原則的核心步驟1:從第i+1個開始選取數字(避免重選) { if(vis[i]==1) continue; vis[i]=1; re[step]=a[i]; dfs(step+1,sum+a[i],i+1); //不降原則的核心步驟2:從第i+1個開始選取數字(避免重選) vis[i]=0; } return;}int main(){ while(cin>>n>>k) { memset(a,0,sizeof(a)); memset(re,0,sizeof(re)); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { cin>>a[i]; } dfs(0,0,0); } return 0;}

運行結果

Python要求O(n)復雜度求無序列表中第K的大元素實例

變形——從N個數中選取k個數求積(舉一反三)

代碼

#include<iostream>#include<cstring>using namespace std;int n,k; //全局變量:從n個數的集合中選取k個數int a[25]; //存放n個數的集合數據int vis[25];//在dfs中記錄數據是否被訪問過int re[25];//存放被選取的數字void dfs(int step,int sum,int start)//參數step代表選取第幾個數字,參數start代表從集合的第幾個開始選{ if(step==k)//如果選夠了k個就輸出 { cout<<re[0]; for(int i=1;i<k;i++) { cout<<’*’<<re[i]; } cout<<’=’<<sum<<endl; } for(int i=start;i<n;i++)//不降原則的核心步驟1:從第i+1個開始選取數字(避免重選) { if(vis[i]==1) continue; vis[i]=1; re[step]=a[i]; dfs(step+1,sum*a[i],i+1); //不降原則的核心步驟2:從第i+1個開始選取數字(避免重選) vis[i]=0; } return;}int main(){ while(cin>>n>>k) { memset(a,0,sizeof(a)); memset(re,0,sizeof(re)); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { cin>>a[i]; } dfs(0,1,0); } return 0;}

運行結果

Python要求O(n)復雜度求無序列表中第K的大元素實例

以上這篇Python要求O(n)復雜度求無序列表中第K的大元素實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜亚洲福利在线老司机| 欧美.日韩.国产.一区.二区| 老牛影视一区二区三区| 欧美日韩一二| 国精品一区二区三区| 99视频精品全国免费| 日韩精品欧美| 国内亚洲精品| 视频在线观看91| 日韩中出av| 国产日韩一区二区三区在线播放 | 福利一区和二区| 中文字幕在线视频久| 91精品一区国产高清在线gif| 欧美精品一二| 亚洲精品高潮| 国产黄色一区| 日本免费一区二区三区四区| 激情综合网五月| 日韩福利视频一区| 久久免费影院| 久久天堂成人| 亚洲丝袜啪啪| 欧美激情麻豆| 国产精品久久久久av电视剧| 欧美精品一区二区久久| 日韩一区二区三区免费视频| 久久亚洲精精品中文字幕| 日本欧美不卡| 日韩中文欧美在线| 欧美精品99| 久久精品亚洲人成影院| 亚洲一区国产| 免费精品一区| 国产精品99一区二区| 亚洲精品黄色| 日产精品一区二区| 国产精品日韩| 麻豆精品新av中文字幕| 日韩av一级| 婷婷久久免费视频| а√天堂8资源中文在线| 999国产精品永久免费视频app| 免费日韩视频| 精品香蕉视频| 国产一级一区二区| 国产乱码精品一区二区三区四区 | 黄色av日韩| 国产午夜一区| 成人av动漫在线观看| 国产欧美日韩一区二区三区四区 | 超碰99在线| 蜜桃一区二区三区在线| 精品久久久久中文字幕小说| 亚洲自拍另类| 精品视频一二| 综合视频一区| 日韩中文字幕高清在线观看| 亚洲精品一区二区在线播放∴| 国产在线不卡一区二区三区 | 波多视频一区| 综合一区av| 欧美男人天堂| 欧美日韩99| 日韩一区三区| 久久国产精品色av免费看| 成人va天堂| 日本91福利区| 日韩不卡视频在线观看| 亚洲精品激情| 国产字幕视频一区二区| 国产极品一区| 在线精品视频一区| 日韩精品一卡| 国产乱码精品| 日韩网站在线| 黑人精品一区| 国产精久久一区二区| 噜噜噜躁狠狠躁狠狠精品视频| 在线看片国产福利你懂的| 91亚洲无吗| 亚洲一区不卡| 欧美日韩亚洲在线观看| 国产精品亚洲欧美日韩一区在线| 五月婷婷亚洲| 韩国久久久久久| 国产精品porn| 91国内精品| 最新日韩欧美| 久久uomeier| 国产精品调教视频| 综合激情视频| 激情综合网五月| 免费看av不卡| 欧美黄页在线免费观看| 日韩二区三区四区| 国产一级久久| 不卡中文字幕| 婷婷成人综合| 97人人精品| 精品高清久久| 国产精品99久久免费观看| 婷婷综合电影| 欧美专区在线| 婷婷综合社区| 91亚洲自偷观看高清| 国产极品一区| 久久国产三级精品| 日本特黄久久久高潮| 中文字幕av一区二区三区人 | 精品丝袜在线| 中文字幕色婷婷在线视频 | 欧美国产视频| 国产精品成人国产| 日本欧美韩国一区三区| 久久亚洲影院| 99亚洲视频| 不卡在线一区| 黑丝一区二区| 亚洲色诱最新| 亚洲少妇自拍| 视频一区欧美日韩| 石原莉奈在线亚洲二区| 国产手机视频一区二区| 黄色成人91| 亚洲一区二区三区免费在线观看| 在线视频精品| 国产精品婷婷| 日韩专区欧美专区| 美女精品一区| 亚洲资源av| 中文字幕av亚洲精品一部二部| 亚洲精品乱码久久久久久蜜桃麻豆 | 在线手机中文字幕| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 欧美黄色精品| 国产一区二区三区天码| 极品av在线| 群体交乱之放荡娇妻一区二区| 日韩国产一区| 久久美女性网| 欧美日韩激情在线一区二区三区| 亚洲一级黄色| 蜜臀久久99精品久久一区二区| 激情综合网站| 一本综合精品| 国产日产精品一区二区三区四区的观看方式 | 99成人超碰| 国产亚洲精品久久久久婷婷瑜伽| 亚洲一区二区小说| 91精品日本| 精品一区二区三区在线观看视频 | 久久久久免费| 1000部精品久久久久久久久| 国产麻豆综合| 日韩精品视频一区二区三区| 日产欧产美韩系列久久99| 欧美久久亚洲| 国产一区二区亚洲| 99国产精品免费视频观看| 红桃视频国产精品| 日韩二区在线观看| 91日韩在线| 亚洲一区观看| 欧美亚洲综合视频| 国产一区丝袜| 日韩一区二区久久| 亚洲乱码一区| 韩日一区二区| 欧美在线资源| 国产精品亚洲成在人线| 日韩免费一区| 亚洲精品女人| 中文字幕一区二区精品区| 麻豆91小视频| 视频一区二区三区在线| 日韩和欧美一区二区| 久久成人福利| 在线看片国产福利你懂的| 亚洲欧洲午夜| 国产欧美大片| 久久久久久免费视频| 国产综合视频| 欧美在线黄色| 中文在线资源| 亚洲精品乱码日韩| 成人一区而且| 亚洲v天堂v手机在线| 正在播放日韩精品| 蜜臀av一区二区在线免费观看| 免费观看在线综合色| 精品久久中文| 视频一区二区不卡| 三上亚洲一区二区| 蜜臀av国产精品久久久久| 成人国产精品| 综合色就爱涩涩涩综合婷婷| 精品福利久久久| 亚洲精品高潮| 欧美亚洲国产激情|