算法学习 (第二部分 ) 数据结构--数组
第二部分 数据结构
一. 数组
1.有序数组的查找 --二分法
int binary1(vector &num, int target, int low, int high)
{
//递归
if (high >= low)
{
int mid = low + (high - low)/ 2;
if (num.at(mid) == target)
return mid;
else if (num.at(mid) > target)
return binary1(num, target, low, mid - 1);
return binary1(num, target, mid + 1, high);
}
return -1;
}
int binary2(vector &num, int target)
{
int low = 0, high = num.size() - 1;
int mid;
while (low <= high)
{
/* code */
mid = low + (high - low) >> 1;
if (num.at(mid) == target)
return mid;
if (num.at(mid) > target)
high = mid - 1;
else
low = mid + 1;
}
return -1;
}
int binary3(vector &num, int target)
{
int low = 0, high = num.size();
while (low < high)
{
/* code */
int mid = low + (high - low) >> 1;
if (num.at(mid) == target)
return mid;
if (num.at(mid) > target)
high = mid;
else
low = mid + 1;
}
return -1;
}
理解二分法对于区间的划分来规定边界情况 数组需要大量的移动数据,在考虑时可以使用两个指针(下标),来记录应当保留(移动的)情况 LeetCode N27_移除元素 理解 滑动窗口 滑动窗口,顾名思义,就是有一个大小可变的窗口,左右两端方向一致的向前滑动(右端固定,左端滑动;左端固定,右端滑动)。可以想象成队列,一端在push元素,另一端在pop元素 LeetCode N209_长度最小的子树组 LeetCode N59_螺旋矩阵2
[low,high] 边界设为 low <= high 下一次选取[low,mid-1]和[mid+1,low]
[low,high) 边界设为 low2.移除元素/插入元素
int removeElement(vector3.通过 长度最小的子树组 理解滑动窗口
(1)滑动窗口内的元素是什么?
(2)如何移动滑动窗口起始位置?
(3)如何滑动窗口终止位置?(1) 滑动窗口算法
(2)适用范围
(3) 算法模板
int left = 0,right =0;
while(right指针未越界){
char ch = arr[right++];
//右指针移动,更新窗口
...
//窗口数据满足条件 对于固定窗口而言,就是窗口的大小>=固定值;对于动态窗口,就是从left出发,窗口不断扩充,第一次满足题意的位置
while(窗口数据满足条件){
//记录或者更新全局数据
...
//右指针不动,左指针开始移动一位
char tmp = arr[left++];
//左指针移动,窗口缩小,更新窗口数据
...
}
//返回结果
...
}
(4) 结论
(5) 实例
int minSubArrayLen1(int target, vector4. 循环情况要理清思路
vector