目录
数组array
基本性质
1 相同数据类型的集合
2 内存空间地址连续,存放在连续内存空间
3 下标从0开始
二分查找
关键问题:
1 区间的定义,循环过程中边界的处理
2 中间间隔奇数个数字时候,(left+right)/2 指针偏左,(left+right)/2 指针偏右
左闭右闭的写法比单边闭合要简单明了
写法一:(左闭右闭)while(left<=right)
int left=0;
int right=nums.size()-1;
while(left<=right)
{
int middle=(left+right)/2;#指针偏左
if(nums[middle]>target)
{
right=middle-1;#未取等,越过middle
}
else if(nums[middle]<target)
{
left=middle+1;
}
else{
return middle;
}
}
return -1;#未找到目标值
相关题目:
69.x 的平方根
367.有效的完全平方数
移除元素
双指针法(快慢指针):在数组和链表的操作中非常常见
思路:一个从0开始的慢指针,作用是在停留在没有出现过要删除的元素之前的位置之前(例如位置n处),用来将快指针探索到的要删除元素之后的第一个元素移动到n+1处。总之,快指针用来寻找要移动的元素及位置,慢指针为要移动的元素保留位置。
产生移动的条件:快指针探寻到与target相等的元素,否则慢指针不执行任何移动,快指针正常移动。
也就是说,快指针的移动不是重点(因为快指针每次都要往后走一步),重点是慢指针的移动条件(当快指针的位置不等于target),这也是为什么代码中判断条件是要判断快指针是否与target相等,因为这恰恰是慢指针移动的条件。
int slowIndex=0;#慢指针,用来保留/停留要移动的位置
while(int fastIndex=0;fastIndex++;fastIndex<nums.size()) #快指针,每次都在数组中移动,用来寻找需要移动的元素
{
if(nums[fastIndex]!=target)#
{
nums[slowIndex++]==nums[fastIndex];#先执行赋值
}
}