数据结构Leecode刷题技巧学习总结
跟着labuladong刷leecode,框架来源:拉不拉东的算法笔记
一、数组篇
前缀和差分
1.前缀主要针对一个数组中 频繁查询某个区间的累加和;
构造前缀和数组int []prefix;
Leecode 第303题 区间内的元素和
2.差分主要针对一个数组中某个区间的元素进行递减;
构造差分数组 int [] diff;
Leecode 第1109题 航班预订统计
二分搜索
二分查找分为三种问题
关键是 :
自变量是谁
单调函数是谁
目标值是谁
之后就是写出单调函数,套框架的问题。
(1) 寻找目标值值,返回角标 左闭右闭,遇到相等,即返回
(2)寻找左侧边间值 即最小值(在f(x)是递增的情况下)左闭右开,遇到相等,即更新mid,返回left
(3)寻找右侧边界值,即最大值(在f(x)是递增的情况下)左开右闭,遇到相等,即更新mid(关键怎么更新),返回right。
int binarySearch(int[] nums, int target){
int left = 0, right = ...;
while(...) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
...
} else if (nums[mid] < target) {
left = ...
} else if (nums[mid] > target) {
right = ...
}
}
return ...;
}
二分查找问题是单调函数寻找目标值问题,这时候就是要写出单调函数f(x);
代替上面的数组即可。
// 函数 f 是关于⾃变量 x 的单调递增函数
int f(int x, int[] nums) {
return nums[x];
}