基础算法
快速排序算法模板
public void quickSort(int[] nums, int start,int end){
if(start >= end) return;
int l = start;
int r = end;
int mid = l + (r-l>>1);
int pivot = nums[mid];
while(l <= r){
while(l <= r && nums[l] < pivot){
l++;
}
while(l <= r && nums[r] > pivot){
r--;
}
if(l <= r){
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
l++;
r--;
}
}
quickSort(nums, start, r);
quickSort(nums, l, end);
}
归并排序算法模板
public void mergeSort(int[] arr,int start,int end){
if(start >= end) return;
int[] temp = new int[start-end];
int mid = start + (end-start>>1);
int l = start;
int r = mid+1;
int index = start;
mergeSort(arr,l,mid, temp);
mergeSort(arr,r,end, temp);
while(l <= mid && r<= end){
if(arr[l] <= arr[r]){
temp[index++] = arr[l++];
}else{
temp[index++] = arr[r++];
}
}
while(l<=mid){
temp[index++] = arr[l++];
}
while(r<=end){
temp[index++] = arr[r++];
}
for(int i = start;i <=end;i++){
arr[i] = temp[i];
}
}
整数二分算法模板
二分搜索总结
bool check(int x) {
}
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
一维前缀和
S[i] = a[1] + a[2] + ... a[i]
a[l] + ... + a[r] = S[r] - S[l - 1]
二维前缀和
S[i, j] = 第i行j列格子左上部分所有元素的和
以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:
S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]
一维差分
S[i] = a[1] + a[2] + ... a[i]
a[l] + ... + a[r] = S[r] - S[l - 1]
for (int i = 1; i <= n; i++) {
a[i] = S[i] - S[i -1]