704.二分查找
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;//[left,right]
while(left <= right){
int middle = left + (right - left)/2;
if(nums[middle] > target){
right = middle - 1;
}else if(nums[middle] < target){
left = middle + 1;
}else{
return middle;
}
}
return -1;
}
};
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
//int right = nums.size() - 1; //左闭右开区间 [left,right)
int right = nums.size();
while(left < right){
int middle = left + (right - left)/2;
if(nums[middle] > target){
right = middle;
}else if(nums[middle] < target){
left = middle + 1;
}else{
return middle;
}
}
return -1;
}
};
待补充34,35
27.移除元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int len = nums.size();
for(int i = 0; i < nums.size(); i++){
if(nums[i] == val){
len--;
for(int j = i; j < nums.size() - 1; j++){
nums[j] = nums[j+1];
}
}
}
return len;
}
};
//边界条件未考虑到
//[3,2,2,3] i = 0; len--; len=3;
//[2,2,3,3] i = 1;
//[2,2,3,3] i = 2; len--; len=2;
//[2,2,3,3] i = 3; len--; len=1;
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int len = nums.size();
for(int i = 0; i < len; i++){
if(nums[i] == val){
for(int j = i + 1; j < len; j++){
nums[j-1] = nums[j];
}
i--;
len--;
}
}
return len;
}
};
双指针解法
注意事项:
1.双指针法(快慢指针)起始条件 slow fast初始都指向数组第一个元素
2.双指针每个指针的含义 fast用来查找新数组所需的元素,slow用来指向元素要存放的位置
3.slow是指向下一个元素要存放的位置,数组下标从0开始,故slow能代表新数组的长度
思想:快慢指针、原地修改
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0, fast = 0;
for(;fast < nums.size();fast++){
if(nums[fast] != val){
nums[slow++] = nums[fast];
}
}
return slow;
}
};
使用erase函数
注意迭代器失效问题
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
vector<int>::iterator iter = nums.begin();
for(;iter != nums.end();){
if(*iter == val){
iter = nums.erase(iter);
}else{
iter++;
}
}
int len = nums.size();
return len;
}
};