704.二分查找
以前不懂二分查找之间的区别,到底是写left<=right还是<,写left=middle+1还是middle,了解到了二分查找可以通过区间端点开闭分为左闭右闭和左闭右开两种常见形式,区间形式不同决定了right的初值以及后续left和right的赋值
区间左闭右闭
//左闭右闭
int search(int* nums, int numsSize, int target) {
int left = 0;
int right = numsSize - 1;
int middle = 0;
while (left <= right) {
middle = (left + right) / 2;
if (nums[middle] == target)
return middle;
if (nums[middle] > target)
right = middle - 1;
else if (nums[middle] < target)
{
left = middle + 1;
}
}
return -1;
}
区间左闭右开
//左闭右开
int search(int* nums, int numsSize, int target){
int left = 0;
int right = numsSize;
int middle = 0;
while (left<right){
middle = left + (right - left) / 2;
if (nums[middle] < target)
left = middle + 1;
else if (nums[middle] > target)
right = middle;
else
{
return middle;
}
}
return -1;
}
27.移除元素
数组中的元素,只能覆盖不能删除,“删除”元素后的数组相当于大小减去“删除”元素数目
思路:fast,slow指针,fast查找需要被删除的元素val,slow指向要被覆盖元素的位置,如果fast指向的元素是val则fast后移,slow不动,若不是则将fast所指位置的值赋给slow所指位置,再同时后移
int removeElement(int* nums, int numsSize, int val){
int fast = 0;
int slow = 0;
while (fast < numsSize)
{
if (nums[fast] != val) {
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}