1. 程式人生 > >劍指offer之最小的K個數(Python)

劍指offer之最小的K個數(Python)

題目描述

輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

這個題目完成的思路有很多,很多排序演算法都可以完成既定操作,關鍵是複雜度性的考慮。以下幾種思路當是筆者拋磚引玉,如果讀者有興趣可以自己再使用其他方法一一嘗試。

思路1:利用冒泡法,臨近的數字兩兩進行比較,按照從小到大的順序進行交換,如果前面的值比後面的大,則交換順序。這樣一趟過去後,最小的數字被交換到了第一位;然後是次小的交換到了第二位,。。。,依次直到第k個數,停止交換。返回lists的前k個數(lists[0:k],前閉後開)

思路2:使用快排中的partition思想。

①我們設定partition函式的哨兵為key=lists[left],在partition函式中完成一輪比較的結果是,比key大的數都在其右邊,比key小的數放在其左邊。完成該輪後返回其left=right時left的值。

②我們判斷left的值是比k大還是小:

如果left的值比k大,說明上輪partition之後,lists中前left個小的數在左邊,其餘的數在其右邊,我們還需要把尋找範圍縮小,下次找的時候只在陣列前面left個數中找了。

如果left的值比k小,說明上輪partition之後,前left個數找的太少了,我們需要再往陣列的後面找。

# -*- coding: utf-8 -*-
"""
Date: Tue Sep 19 10:50:11 2017

Created by @author: xiaoguibao

E-mail: 
[email protected]
Content: 找最小的k個數 """ def function1(lists,k): # 冒泡法 length = len(lists) for i in range(k): for j in range(i+1,length): if lists[i] > lists[j]: lists[j],lists[i] = lists[i],lists[j] return lists[0:k] """ 思路2 包括2個部分function2_partion和function2 """ def function2_partion(lists,left,right): #劃分函式處理部分 key = lists[left] while left < right: while left < right and lists[right] >= key: right -= 1 lists[left] = lists[right] while left < right and lists[left] <= key: left += 1 lists[right] = lists[left] lists[right] = key return left def function2(lists,k): #劃分法主要函式部分 length = len(lists) left = 0 right = length - 1 index = function2_partion(lists,left,right) while k!=index: if index > k-1: right = index-1 else: left = index+1 index = function2_partion(lists,left,right) return lists[0:k] def main(): lists = [1,1,6,4,11,9,2,10,3] # print "思路一(冒泡法):",function1(lists,8) print "思路二(劃分法):",function2(lists,8) if __name__=="__main__": main()


相關推薦

offerK個數Python

題目描述 輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。 這個題目完成的思路有很多,很多排序演算法都可以完成既定操作,關鍵是複雜度性的考慮。以下幾種思路當是筆者拋磚引玉,如果讀者有興趣

offer:序列化二叉樹Python

題目描述 請實現兩個函式,分別用來序列化和反序列化二叉樹。 解題思路 序列化二叉樹:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串。需要注意的是,序列化二叉樹的過程中,如果遇到空節點,需要以某種符號(這裡用#)表示。以下圖二叉樹為例,序列化二叉樹時

offer:表示數值的字串Python

題目描述 請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示數值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。 解

【Java】 offer(40) k個數Offer》Java實現合集 offer(39) 陣列中出現次數超過一半的數字 《Offer》Java實現合集

本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集   題目    輸入n個整數,找出其中最小的k個數。例如輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。 思路   思路一:同劍指offer(39

offerk個數(兩種解法)

題目描述 輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。 解法1 使用partition函式可以知道,使用==O(N)==的時間複雜度就可以找出第K大的數字,並且左邊的數字比這個數小,右邊的數字比這

offer》——K個數

最小的K個數 題目:輸入n個整數,找出最小的K個數,例如輸入4,5,1,6,2,7,3,8,則輸出1,2,3,4。 一定要考慮邊界情況: - 陣列為空 - k大於陣列size - k小於0 思路一:最

Offer-29.K個數Javascript

29.最小的K個數 題目連結 題目描述 輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。 解題思路 我使用的氣泡排序 Code

Offerk個數

題目:輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。 這道題最簡單的思路莫過於把輸入的n個整數排序,排序之後位於最前面的k個數

Offer 65. 矩陣中的路徑 回溯

題目描述 請設計一個函式,用來判斷在一個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則之後不能再次進入這個格子。 例如 a b c e s f c s a d e e 這樣的3 X

Offer 53. 表示數值的字串 字串

題目描述 請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。 題目地址 https://www.nowcoder.c

Offer 52. 正則表示式匹配 字串

題目描述 請實現一個函式用來匹配包括'.'和'*'的正則表示式。模式中的字元'.'表示任意一個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配 題目地

offer》系列 字串的排列Java

連結 牛客: 字串的排列 題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 輸入描述: 輸入一個字串,長度不超過9(可能有字元重複),字元只包括

【LeetCode & offer刷題】Two Sum系列

Evernote Export body,td { font-family: 微軟雅黑; font-size: 10pt } 1 .   Two Sum Given an array of integers, ret

求一個數組的k個數java

問題描述:求一個數組的最大k個數,如,{1,5,8,9,11,2,3}的最大三個數應該是,8,9,11 問題分析:     1.解法一:最直觀的做法是將陣列從大到小排序,然後選出其中最大的K個數,但是這樣的解法,複雜度是O(logn*n),但是有時候並不需要排序,用簡單的選

offer演算法題分析與整理

下面整理一下我在刷劍指offer時,自己做的和網上大神做的各種思路與答案,自己的程式碼是思路一,保證可以通過,網友的程式碼提供出處連結。 目錄 1、陣列中的逆序對 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸

offer:複雜連結串列的複製java

public class Solution { public ComplexListNode Clone(ComplexListNode pHead) { if(pHead == null){ return null; }

offer》系列 K個數Java

連結 牛客:最小的K個數 題目描述 輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。 思路 我們需要藉助一個輔助的函式,就是快排當中的分割(Partition),我們只要找到第k個數,就根據pa

offer-k個數陣列

題目描述 輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。 這道題需要注意的就是input.size()<k這個情況, 其他的思路就很簡單,排序,輸出 方法一:sort函式 由於用到了sort函式,因

offer找出陣列中的n個數優先佇列

這道題最簡單的就是排序,時間複雜度O(nlogn)。不再講述。這裡可以使用優先佇列,時間複雜度O(nlogk)。注意檢驗k的合法性,不然初始化佇列時會報錯。import java.util.ArrayL

offer——輸出陣列中k值(快速,冒泡,選擇,插入

找k個最小值,基本思路是對陣列排序,輸出前k個或者後k個,我們回顧一下之前的學習過的集中排序方法: 快速排序 class Solution(): def GetLeastNumbers_Solution(self, tinput,k): def quick_sor