代码随想录算法训练营第一天 ##二分查找 ##移除数组元素(快慢指针)
- 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:输入:
nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums中并且下标为 4
注意:二分查找要区分左闭右开[left,right)、左闭右闭[left,righ]。
左闭右闭[left,righ]。左闭右开[left,right)时:left<right应为当right=left是为空集。
左闭右闭[left,righ] | 左闭右开[left,right) |
---|---|
while(left<=right) | while(left<right) |
right=middle-1 | right=middle |
//C语言左闭右闭
int search(int* nums, int numsSize, int target) {
int left=0;
int right=numsSize-1;
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-1;
}
else if (nums[middle]==target){
return middle;
}
}
return -1;
}
//C语言左闭右开
int search(int* nums, int numsSize, int target) {
int left=0;
int length=numsSize;
int right=length;
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 if (nums[middle]==target){
return middle;
}
}
return -1;
}
第27题移除数组
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思路快慢指针
int removeElement(int* nums, int numsSize, int val) {
int fast=0,slow=0;
for (fast=0;fast<numsSize;fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
总结:对于二分查找要注意左闭右开的区间;对于删除数组一开始是(暴力O(n2))删除一位然后把后面的元素前移;使用快慢指针时间复杂度(o(n))快慢指针用的地方很多