题目:
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
参考:https://www.programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
用开闭区间去考虑这个问题
比如现在假定Left right 均在闭区间
因此当target>nums[Mid]或target>nums[Mid],target都没有等于的情况,所以需要middle+1 或者 middle -1, 所以存在Left right 二者在往中间逼近的过程中 存在等于的情况
int search(int* nums, int numsSize, int target) {
int Mid = 0;
int Left = 0;
int Right = numsSize - 1;
while(Left <= Right)
{
Mid = (Right+Left)/2;
if(target>nums[Mid])
{
Left = Mid+1;
}
else if(target<nums[Mid])
{
Right = Mid-1;
}
else if(target == nums[Mid])
{
return Mid;
}
}
return -1;
}
假如是左闭右开
那么必须是 [left right),不存在等于的情况,因为最后结果是nums[right]
所以 right 不需要改为 mid-1
移除元素
https://www.programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
一开始的暴力想法
int removeElement(int* nums, int numsSize, int val) {
int Count = 0;
int Flag = 0;
for(int i=0; i<numsSize; i++)
{
if (nums[i] == val)
{
for(int j=i; j<numsSize-1; j++)
{
nums[j] = nums[j+1];
}
Count++;
i--;
}
}
return numsSize - Count;
}
但并不能正确更新数组索引
采用双指针的方式 主动去记录 不是相同的元素并记录
int removeElement(int* nums, int numsSize, int val) {
int i = 0;
int j = 0;
while(i < numsSize)
{
if(nums[i] != val)
{
nums[j] = nums[i];
j++;
}
i++;
}
return j;
}
成功