1. 程式人生 > 其它 >Acwing Arithmetic Learning:資料結構(1)

Acwing Arithmetic Learning:資料結構(1)

資料結構(1)acwing

目錄

(用陣列模擬--->稱為靜態連結串列)

1.單鏈表和鄰接表(儲存樹和圖)

規範:

  • -1表示空集,idx:指標(當前用到了哪個點)
  • 第1個插入數的下標為0,因此第k個插入數的點下標為(k-1)

int e[N]:代表陣列內部的值,ne[N]:代表指標,指向下一個節點

插入節點到連結串列中步驟:

(1)將x插到head結點

(2)將x插到k節點後面

(3)刪除下標是k的後面的點

void remove(int k){
	ne[k] = ne[ne[k]];
}

2.雙鏈表:優化某些問題

  • 規範:

    • int e[N]、l[N]、r[N],idx
    • 0:左端點,1:右端點
  • 1.插入結點步驟:

// 在下標為k的點的右邊,插入x
void add(int k,int x){
	e[idx] = x;
    r[idx] = r[k];
    l[idx] = k;
    l[r[k]] = idx;
    r[k] = idx;
}

ps: 想要在下標為k的左邊,插入x----》最easy方式:add(l[k],x)

  • 2.刪除節點

    // 刪除第k個點
    void delete(int k){
        r[l[k]] = r[k];
        l[r[k]] = l[k];
    }
    

3.棧

  • 單調棧:(時間複雜度:O(n)----->出棧及入棧分別為n)

    int n;
    int stk[N],tt;
    int main(){
        cin >> n;
        for(int i = 0; i < n; i++){
            int x;
            cin >> x;
            while(tt && stk[tt] >=x) t--;
            if(tt) cout << stk[tt] << ' ';
            else cout << -1 << ' ';
            
            stk[ ++ tt] = x;
        }
        return 0;
    }
    

4.佇列

  • 單調佇列:

    • 規範:hh = 0,tt = -1
  • 實現程式碼(滑動視窗)------{沒看懂}

5.KMP演算法

  • 思路:
  1. 暴力演算法怎麼做?
  2. 如何去優化?