702.二分查找
题目链接:二分查找
文章讲解:代码随想录.二分查找
视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili
二分前提:有序数组,数组中无重复元素
方法:结合数组的特征,可以为左闭右闭区间[0, 数组长度-1],或者左闭右开区间[0, 数组长度)。
思考:左开右开区间,左开右闭区间,会怎样?
小细节:
1. 加减运算符优先级高于位移运算符
2. 求两个数的中间值:mid = start + (end - start >> 1)
int search(int* nums, int numsSize, int target){
int mid, start, end = 0;
/*左闭右开区间*/
for(start = 0, end = numsSize - 1; start <= end;)
{
mid = start + (end - start >> 1);
if(target == nums[mid])
{
return mid;
}
else if(target > nums[mid])
{
start = mid + 1;
}
else if(target < nums[mid])
{
end = mid - 1;
}
}
return -1;
}
int search(int* nums, int numsSize, int target){
int mid, start, end = 0;
/*左闭右开区间*/
for(start = 0, end = numsSize; start < end;)
{
mid = start + (end - start >> 1);
if(target == nums[mid])
{
return mid;
}
else if(target > nums[mid])
{
start = mid + 1;
}
else if(target < nums[mid])
{
end = mid;
}
}
return -1;
}
27.移除元素
题目链接:移除元素
文章讲解:代码随想录.快慢指针
视频讲解:数组中移除元素并不容易! | LeetCode:27. 移除元素
踩坑:快慢指针角色必须如此吗?尝试慢指针判断数值,快指针++未成功,二刷再看看
int removeElement(int* nums, int numsSize, int val){
int i, j = 0;
for(i = 0, j = 0; j < numsSize; j++)
{
/*j:快指针,用于获取满足要求的数值*/
if(val != nums[j])
{
/*i:慢指针,用来记录最终的数组下标*/
nums[i++] = nums[j];
}
}
return i;
}
int removeElement(int* nums, int numsSize, int val){
int i, j, cnt = 0;
if(1 == numsSize)
{
if(val == nums[0])
{
return 0;
}
else
{
return 1;
}
}
/*暴力解法*/
for(i = 0; i < numsSize - cnt; )
{
if(val == nums[i])
{
for(j = i; j < numsSize - cnt - 1; j++)
{
nums[j] = nums[j + 1];
}
cnt++;
}
else
{
i++;
}
}
return (numsSize - cnt);
}