原创 動態規劃的高度套路

動態規劃(百度百科) 動態規劃(dynamic programming)是運籌學的一個分支,是求解決策過程(decision process)最優化的數學方法。20世紀50年代初美國數學家R.E.Bellman等人在研究多階段決

原创 神級基礎排序——歸併排序

歸併排序的介紹 歸併排序(英語:Merge sort,或Mergesort),是創建在歸併操作上的一種有效的排序算法,其時間複雜度爲O(N*logN)。1945年由約翰·馮·諾伊曼首次提出。該算法是採用分治法(Divide an

原创 String源碼粗略解讀

前言 基本上只要是Java程序員,就肯定會接觸過String類。博主我是大三參加藍橋杯比賽才學會用String類的charAt(),length(),toString()等等常用函數。所以今天有時間來看看String的源碼,分析

原创 HashMap源碼粗略解讀(面試必問)

本文主要以幾個方面來講解一下HashMap: 1、HashMap默認容量 2、HashMap如何擴容 3、HashMap的數組大小爲什麼一定要是2的冪 4、HashMap爲什麼是線程不安全的 5、Java7到Java8做了哪些改進

原创 基礎排序(冒泡、選擇、插入)

前言 基本每個人入門數據結構和算法都是先經歷過排序,今天就來講解一下最基礎的三個入門排序算法。分別是冒泡排序、選擇排序和插入排序。 冒泡排序 思路:兩兩交換,小的往左邊,大的往右邊。 就是每趟過程把最大的數往右邊靠,然後從剩

原创 淺談單例模式的實現方式

單例模式(來自菜鳥教程) 單例模式(Singleton Pattern)是Java中最簡單的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。這種模式涉及到一個單一的類,該類負責創建自己的對象,同時

原创 神級基礎排序——快速排序

概念 快速排序是一種原地排序,只需要一個很小的棧作爲輔助空間,空間複雜度爲O(logN),所以適合在數據集比較大且無序的時候使用。實現方法有經典快排和雙指針快排,本文介紹的是雙指針快排的實現。 【注意】:快排的經典排序實現的p

原创 ArrayList源碼粗略解讀(面試必問)

前言 現如今的Java程序員越來越多,學習者也越來越多。基本上使用Java的都會使用過HashSet、HashMap、ArrayList、LinkedList等集合,今天god-jiang就從源碼層面上粗略解讀一下ArrayLi

原创 LeetCode刷題系列——編輯距離

LeetCode72編輯距離 思路 dp[i][j] 表示 word1 到 i 位置 轉換成 word2 到 j 位置需要最少的步數。 當 word1[i] == word2[j],dp[i][j] = dp[i-1][j-1

原创 神級運算——位運算

位運算概述 從現代計算機中所有的數據都以二進制的形式存儲在設備中。即0、1兩種狀態,計算機對二進制進行的運算(+、-、*、/)都叫位運算。示例: int a = 35; int b = 47; int c = a + b; 計算

原创 神級基礎排序——堆排序

堆排序的介紹 堆排序(Heapsort)是指利用堆積樹(堆)這種數據結構所設計的一種排序算法,它是選擇排序的一種。可以利用數組的特點快速定位指定索引的元素。堆分爲大根堆和小根堆,是完全二叉樹。 完全二叉樹:除了最後一層之外的

原创 劍指offer系列——數組中的逆序對

前言 最近一直在家刷面經,因爲疫情也出不去。所以沒事就會在知乎回答別人提出的問題,還有就是刷題。最近leetcode授權了劍指offer的題,然後就當作我是複習吧。目前還在刷,今晚喫飽刷到這道歸併排序的進階題目——數組中的逆序對

原创 排列組合的模板算法

排列組合(百度百科) 排列組合是組合學最基本的概念。所謂排列,就是指從給定個數的元素中取出指定個數的元素進行排序。組合則是指從給定個數的元素僅僅取出指定個數的元素,不考慮排序。排列組合的中心問題是研究給定要求的排列和組合可能出現

原创 過年之搶紅包算法

前言 昨天是大年初一,怎麼說呢,因爲在讀大學, 沒有出來工作,所以昨晚也是陸陸續續有收到一些紅包。然後想起自己對算法感興趣,以前也看過一些公衆號有講過搶紅包算法,今天就更新一遍關於搶紅包的算法,對學過數據結構或者對搶紅包感興趣的

原创 棧(Stack)與隊列(Queue)

定義 棧:後進先出(LIFO-last in first out):最後插入的元素最先出來。 隊列:先進先出(FIFO-first in first out):最先插入的元素最先出來。 圖示 本文通過一些簡單的算法題來帶你們