演算法基礎課 第一章 基礎演算法(三)

2021-10-08 16:16:04 字數 876 閱讀 6634

核心在於優化了o(n^2)成o(n)

for (int i = 0, j = 0; i < n; i ++ )

常見問題分類:

(1) 對於乙個序列,用兩個指標維護一段區間

(2) 對於兩個序列,維護某種次序,比如歸併排序中合併兩個有序序列的操作

799. 最長連續不重複子序列

800. 陣列元素的目標和

求n的第k位數字: n >> k & 1

返回n的最後一位1:lowbit(n) = n & -n

801. 二進位制中1的個數

vectoralls; // 儲存所有待離散化的值

sort(alls.begin(), alls.end()); // 將所有值排序

alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去掉重複元素

// 二分求出x對應的離散化的值

int find(int x) // 找到第乙個大於等於x的位置

return r + 1; // 對映到1, 2, ...n

}

802. 區間和

本質是貪心排序(會議安排那種)

// 將所有存在交集的區間合併

void merge(vector&segs)

); st = seg.first, ed = seg.second;

}else ed = max(ed, seg.second);

if (st != -2e9) res.push_back();

segs = res;

}

803. 區間合併

基礎課第一章 基礎演算法

快排 歸併排序 模板背會。模板題目默寫一遍。提高熟練度。同乙個模板題重複3 5次?確定分界點x 取左邊界 q l 中間值 q l r 2 q r 隨機 調整區間。使第乙個區間的數都小於等於x。第二個區間都大於等於x。難點 遞迴處理左右兩段 調整區間方法 最簡單 開兩個新陣列a b。掃瞄陣列所有數。如...

演算法基礎課 第一章 基礎演算法(一)

在q l r 中 確定分界點 q l q l r 2 q r 隨機 調整區間 使得分界點x的左側,數值皆 x,右側皆 x i j兩者從左 右兩個方向分別尋找不符合的數字,然後兩者交換,直至相遇 遞迴處理左右兩段 模板 如下 一定記牢 void quick sort int q,int l,int r...

演算法基礎第一章

不同常數時間的操作 加或定址運算或位運算 執行時間不一樣 選擇最小的數,放到陣列的第乙個位置 時間複雜度 c n c n 1 c n 2 c 1 o n 2 額外空間複雜度 o 1 兩兩比較並交換,直到無交換 時間複雜度 o n 2 額外空間複雜度 o 1 左邊序列有序,右邊新加入乙個數,從右往左找...