核心在於優化了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 左邊序列有序,右邊新加入乙個數,從右往左找...