参考内容:
704.
第一想法
1.middle依次和目标值作比较大于则向左缩进,小于则向右缩进
2.不能直接相加/2,会超范围
*超出了时间限制
//middle依次和目标值作比较大于则向左缩进,小于则向右缩进
int search(int* nums, int numsSize, int target){
if(target<nums[0]||target>nums[numsSize-1])
return -1;
else
{
int left = 0,right = numsSize - 1;
int middle = left+(right-left)/2;//不能直接相加/2,会超范围
int i;
//当middle不等于target时分别判断其与target的关系,一半一半的缩放
while(nums[middle]!=target)
{
if(nums[middle]>=target)
{
right = middle;
middle = left+(right-left)/2;
}
else
{
left = middle;
middle = left+(right-left)/2;
}
}
return middle;
}
}
无法判断target没在里面的情况
改正:
先确定好区间范围再写while里面的判断条件以及middle的赋值
//先找好而二分法的区间是左闭右闭还是左开右闭等
//以[left,right]区间为讨论
int search(int* nums, int numsSize, int target){
int left = 0,right = numsSize-1;
while(left<=right)//left = right有效
{
int middle = left+(right-left)/2;
if(nums[middle]<target)
{
left = middle+1;//nums[middle]肯定不是目标值;
middle = left+(right-left)/2;
}
else if(nums[middle]>target)
{
right = middle - 1;//同理
middle = left+(right-left)/2;
}
else
return middle;
}
return -1;
}
另一种写法
不同:初始l与r时r是numsSize,而不用减一
int search(int* nums, int numsSize, int target){
int left = 0,right = numsSize;
while(left<right)
{
int middle = left+(right-left)/2;
if(nums[middle]<target)
{
left = middle+1;
middle = left+(right-left)/2;
}
else if(nums[middle]>target)
{
right = middle;
middle = left+(right-left)/2;
}
else
return middle;
}
return -1;
}
27.
双指针
//双指针,快指针找新数组所需要的元素,满指针即为新数组
int removeElement(int* nums, int numsSize, int val){
int slow = 0;
for(int fast = 0;fast < numsSize;fast++)
{
if(nums[fast]!=val)
{
nums[slow++]=nums[fast];//找到要求数组,slow加一
}
}
return slow;
}