數組、鏈表、leetcode

數組

數組是一個線性表,存儲相同數據結構的連續的內存空間。

數組的優劣

一:優勢

隨機訪問時間複雜度為常數級別。

支持cpu緩存,訪問速度更加快速。(因為內存空間是連續的所以知道收地址的內存地址,cpu緩存就可以預讀整個數組的所有數據。)

一維數組的內存計算公式:a[i]address = base_address + (i-1)*data_type_size

二維數組的內存計算公式: address = base_address + ( i * n + j) * type_size

二劣勢 刪除慢 刪除一個數據需要進行數據搬移,是非常耗時的

優化 對刪除的數據進行標記,不刪除,當數組的存儲空間不足的時候,在進行一次整體的刪除操作,減少了搬移的次數(垃圾回收機制的標記清楚算法)

插入慢 插入數據的時候,數據搬移

優化 針對有序數組沒發優化

無序數組 插入的新數據都插入末尾

跟要插入的數據進行交換。

大小有限,警惕數組索引越界(java.lang.ArrayIndexOutOfBoundsException)

容器與數組的對比 優勢 容器最大的優勢就是1將數組的操作細節封裝了起來。2.支持動態擴容。

二:劣勢 容器不能存儲基本數據類型

數組效率高(知道數據大小的情況下)(底層開發數組的效率更高)

多維情況下,數組更加直觀

leetcode題目(移動零):

class Solution {

//first solution

//1.just find non-zero data 2.finally fill of all zero data.3.index is non-zero data's count.

public void moveZeroes(int[] nums) {

int index = 0;

for(int num:nums){

if(num!=0){

nums[index++]=num;

}

}

while(index<nums.length>

nums[index++] = 0;

}

}

//second solution

//1.tow pointer ,first pointer is the first zero data's address,second pointer is the foreach count.

public void moveZeroesSecond(int[] nums){

//first pointer

int i = 0;

//second pointer

int j = 0;

for(; j< nums.length; j++){

//if nums[j] != 0 i++

if( nums[j] != 0 ) {

// exchage condition

if( i != j){

exchage(i,j,nums);

}

i++;

}

}

}

private void exchange(int[] nums, int i, int j) {

nums[i] = nums[i] ^ nums[j];

nums[j] = nums[i] ^ nums[j];

nums[i] = nums[i] ^ nums[j];

}

}

複製代碼鏈表

鏈表的分類:

單向鏈表

雙向鏈表

循環鏈表

靜態鏈表

鏈表的優劣:

優勢 刪除,插入快

劣勢 隨機訪問慢

頻繁的刪除插入容易產生內存碎片,造成頻繁的gc

鏈表實戰

1.鏈表環形檢測(leetcode):

//給定一個鏈表,判斷鏈表中是否有環。

//

// 為了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環。

//

//

//

// 示例 1:

//

// 輸入:head = [3,2,0,-4], pos = 1

//輸出:true

//解釋:鏈表中有一個環,其尾部連接到第二個節點。

//

//

//

//

// 示例 2:

//

// 輸入:head = [1,2], pos = 0

//輸出:true

//解釋:鏈表中

"/<nums.length>


分享到:


相關文章: