前段時間面試百度Java技術崗時碰到了一道算法題:任意數分三組,使得每組的和儘可能相等。因爲時間倉促,加之面試時頭昏腦漲,這道題沒作出來甚至沒有給出思路,致使百度面試之旅失敗。這讓我多少有些遺憾和不甘。由於最近接觸算法的東西較多並且自己對算法感興趣,因此回家以後絞盡腦汁想把這題作出來。程序員
說說個人思路:首先必定要先排序,這也是解決問題的關鍵。而後降序排序後的前三個數各分一組把剩餘數往三個數上疊加。我最開始的思路也是如此,問題在於分組個數不肯定,出現極端大的數怎麼辦,怎麼疊加?那層窗戶紙就是將剩餘數中的最大值加到前三個數的最小值上,而後重排序,繼續疊加,直到數組個數剩三個爲止!(不知道你們能不能看懂)我過後解題思路大體就是這樣,太苦逼了。面試
還記得我當初校招的時候第一場面試也是倒在算法,算法能夠說是咱們每一個程序員的痛,明明平時工做的時候不會太多用到,但這個倒是面試必問的點,也是咱們進階必需要面對的東西。如今算法挺吃香的,但咱們也不可能全身心的投入到算法的學習,這時候就須要一本好的參考書來協助咱們學習。下面要與你們介紹的文檔能夠做爲從事計算機研究與開發的技術人員的參考書,特別是對正在準備面試、參加選拔性考試以及校園面試的讀者尤其有用。算法
這份文檔以Java爲描述語言,介紹了計算機編程中使用的數據結構和算法。這份文檔強調問題及其分析,而非理論闡述,共分爲21章,講述了基本概念、遞歸和回溯、鏈表、棧、隊列、樹、優先隊列和隊、並查集DAT、圖算法、排序、查找、選擇算法(中位數)、符號表、散列、字符串算法、算法設計技術、貪婪算法、分治算法、動態規劃算法、複雜度類型等內容。每章首先闡述必要的理論基礎,而後給出問題集。文檔中大約有700個算法問題及相應的解法,對於許多問題,文檔中提供了多個具備不一樣複雜度的解決方法。因爲篇幅限制沒法所有展現出來,須要的朋友 看我主頁簡介便可!
第1章緒論編程
本章的目的是闡述算法分析的重要性、它們的表示法和關係,並儘量求解多個問題。首先,讓咱們重點關注算法的基本要素、分析的重要性,而後再逐步討論上述說起的其餘主題。在完成本章的學習後,可以分析任意給定算法的複雜度(特別是遞歸函數)。
第2章遞歸和回溯數組
本章將探討一個重要的內容「遞歸」。本書中幾乎每章都要用到遞歸,同時還介紹一個與之相關的概念「回潮」。
第3章鏈表瀏覽器
第4章棧數據結構
第5章隊列多線程
第6章樹數據結構和算法
第7章優先隊列和堆函數
第8章並查集ADT
本章將介紹一種很是重要的數學概念;集合。它說明如何表示一組無需考慮順序的元素。並查集ADT能夠表示一組無序元素,可用來解決等價問題。並查集易於實現,使用一個簡單數組就能實現它,且每一個函數也只需幾行代碼。在許多算法中,並查集ADT是做爲一個輔助數據結構而存在的(例如,圖論中的Kruscal算法)。在討論並查集ADT前,首先了解集合的幾個基本性質。
第9章圖算法
在現實世界中,許多問題是由對象以及它們之間的聯繫所描述的。例如,在航空地圖中,咱們可能對這樣的問題感興趣:「從海德拉巴去紐約,哪一種方式最快?」或者「哪一種方式價格最便宜?」爲了回答這些問題,須要關於對象(城鎮)之間的聯繫(飛行路線)信息。圖就是用來解決這類問題的數據結構。
第10章排序
第11章查找
第12章選擇算法(中位數)
第13章符號表
第14章散列
第15章字符串算法
爲了理解字符串算法的重要性,考慮在任意一個瀏覽器(如InternetExplorer、Fire-fox或Google Chrome)中輸入一個URL(Uniform Resource Locator,統一資源定位符)時發生的狀況。在鍵入URL的一些前綴字符後,能夠看見瀏覽器會顯示一個全部可能的URL.列表。這意味着,瀏覽器執行了一些內部處理後,給用戶一個可能匹配的URL列表。這種技術常稱爲自動完成。
第16章算法設計技術
前面的章節針對不一樣的問題介紹了各類算法。在求解一個新問題時,一般的思路是尋找當前問題與已解決問題之間的類似之處,從面輕鬆找到新問題的求解方法。本章將對各類算法按照不一樣的方法進行分類,而後在隨後的3章中分別介紹3個算法設計思想〔即貧婪、分治和動態規劃〕.
第17章貪婪算法
首先經過對一個簡單理論的討論,初步理解貪婪思想。如下棋爲例,每一步的決策都須要考慮對後續棋局的影響。而在網球(或排球)比賽中,選手的行爲僅取決於當前的情況,選擇當下最爲正確的動做,而不關心後續的影響。這說明在某些狀況下選擇當下最佳行爲的決策,能夠獲得一個最優解(貪婪),但並不是全部狀況都如此,貪婪策略適用於上述第二類問題。第18章分治算法
第18章 分治算法
對於第17章列舉的許多問題,貪婪策略不能提供最優解。而其中的某些問題可經過分支(Divid and Conquer,D&C)法來輕鬆求解。分治法是一種重要的基於遞歸的算法設計技術,分治算法遞歸地將問題分解爲兩個或多個同類型的子問題,直至這些子問題簡單到可以直接求解,而後再將這些子同題的解合成爲原始問題的解。
第19章動態規劃算法
本章將試圖求解那些採用其餘技術(如分治法和貪婪法)沒法得到最優解的問題。動態規劃(Dynamic Programming,DP)是一項雖簡單但較難掌握的技術。一個容易識別和求解DP問題的方法是經過求解儘量多的問題。「Programming」一詞並非指編程,二是表示填充表格(相似於線性規劃)
第20章複雜度類型
在前面的各章中,描述了不一樣問題求解的複雜度。某些算法隨着問題規模的增長其複雜度的增加速率較低,而另外一些則有比較高的增加速率。對於具備較低增加率的問題,稱爲簡單問題(或易求解問題);對於具備較高複雜度的問題,稱爲難問題(或難求解問題)。該分類是基於求解某個問題時算法的運行時間(或者佔用內存)決定的。
第21章雜談
本章將介紹一些對於面試和考試有用的話題,咱們來看看文中的一些其餘的編程題。
這些問題你能答出多少?(手動狗頭)反正我一時半會搞不定。不過不要緊文檔中也是有着每一題的解析,最後咱們來看一看一位大佬對算法的一些見解。
PS:我國軟件學習形式主義太過嚴重,算法這種東西必需要與實踐相結合才能真正起到做用,不少程序員算法很是厲害但是就是作不出東西,爲啥,由於他們並不能能深入理解算法,不少狀況就是機械性套用算法,並且算法這種東西必需要與編程技術相結合,單一的算法幾乎難以解決問題,好比雲計算就屬於算法,與互聯網技術,多線程技術,多進程技術,和各類軟硬件技術結合體,單一從一個層面去看算法幾乎解決不了任何問題,國外的頂級軟件大師則是將算法轉化爲計算機能夠識別算法,並結合於其餘計算機技術,使其達到最大效能,例如深度學習就和cuda相結合,使其最好的運轉在某些硬件之上,再加之cuda具備極強並行運算能力,其效能達到最大化,其實算法與計算機技術具備極大跨度須要那種對數學或其餘學科與計算機都較爲精通的人才能正真轉化,不然單—算法工程也僅僅只是書呆子的形式。難成大事。
我以爲他字多他說的都對,言歸正傳若是有朋友須要算法文檔,看我主頁簡介便可~