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

2021-10-08 15:23:49 字數 1232 閱讀 2154

在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)

quick_sort(q, l, j), quick_sort(q, j + 1, r);

}

785. 快速排序

786. 第k個數

在q[l:r]中

確定分界點:mid=l+r>>1

遞迴排序左右兩區間

歸併——合二為一(雙指標,取兩個區間中最小值,放入結果陣列中)

void merge_sort(int q, int l, int r)

787. 歸併排序 

788. 逆序對的數量

本質是整個區間在左或右半部分不滿足某種性質,而另一半部分滿足該性質,整數二分即找到分界點

int binary_search(int nums, int n, int target)  else if (nums[mid] > target)  else if(nums[mid] == target) 

}// 直接返回

return -1;

}int left_bound(int nums, int n, int target)

// 最後要檢查 left 越界的情況

if (left >= n || nums[left] != target) return -1;

return left;

}int right_bound(int nums, int n, int target)

// 最後要檢查 right 越界的情況

if (right < 0 || nums[right] != target) return -1;

return right;

}

789. 數的範圍

bool check(double x)  // 檢查x是否滿足某種性質

double bsearch_3(double l, double r)

return l;

}

790. 數的三次方根

基礎課第一章 基礎演算法

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

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

核心在於優化了o n 2 成o n for int i 0,j 0 i n i 常見問題分類 1 對於乙個序列,用兩個指標維護一段區間 2 對於兩個序列,維護某種次序,比如歸併排序中合併兩個有序序列的操作799.最長連續不重複子序列 800.陣列元素的目標和 求n的第k位數字 n k 1 返回n的最...

演算法基礎第一章

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