704.二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
思路
使用不需要考虑mid+1、mid-1的二分查找模板
int left = -1, right = n;
while(left+1!=right)
{
int mid = left+right >> 1;
if(check())
left = mid;
else
right = mid;
}
代码实现
class Solution{
public:
int search(vector<int>& nums, int target) {
int left = -1;
int right = nums.size();
while(left+1!=right)
{
int mid = left + right >> 1;
if(nums[mid]>target)
right = mid;
else if(nums[mid]<target)
left = mid;
else
return mid;
}
return -1;
}
};
时间复杂度:O(log2n)
空间复杂度:O(1)
27. 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思路
双指针法
- 快指针:不断向前,寻找目标元素
- 慢指针:更新数组
代码实现
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fast = 0;
int slow = 0;
int nlen = nums.size();
while(fast<nlen)
{
if(nums[fast]!=val)
nums[slow++] = nums[fast];
fast ++;
}
return slow;
}
};
时间复杂度:O(n)
空间复杂度:O(1)