二分查找
题目描述
代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int begin = 0 , end = nums.size()-1;
while(begin<=end)
{
int mid = begin + ((end-begin)>>1);
if(nums[mid]==target)
return mid;
else if(nums[mid]>target)
{
end = mid-1;
}
else
begin = mid+1;
}
return -1;
}
};
移除元素
题目描述
代码
解法1
在代码里直接调用标准库(这在面试中是万万不可以的,这里只是回忆一下C++标准库中的一个方法)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
for (auto a = nums.begin();a!=nums.end();a++)
{
if(*a == val){
nums.erase(a);
a--;
}
}
return nums.size();
}
};
解法2 暴力求解
理解:
题目中所说的原位操作,并不是将原始的vector更改,而是输出一个索引,一个长度。病没有改变原有的实参的长度。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int idx = 0;
for(auto x : nums)
if(x != val)nums[idx++] = x;
return idx;
}
}
解法3 使用双指针
使用快慢指针的思路,使用慢指针维护不匹配的值,使用快指针来匹配val。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fast= 0, low = 0;
for(auto i : nums)
{
if(i!=val)
{
nums[low] = nums[fast];
fast++;
low++;
}
else
{
fast++;
}
}
return low;
}
};