LeetCode704. 二分查找
题目链接 704. 二分查找
左闭右开
感觉和c++数组更合适
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();
while(left < right){
int middle = left + ((right-left)>>1);//位运算右移1即/2
if(nums[middle] < target){
left = middle+1;
}else if(nums[middle] > target){
right = middle;
}else{
return middle;
}
}
return -1;
}
};
左闭右闭
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
while(left <= right){
int middle = left + ((right-left)>>1);//用加法避免溢出
if(nums[middle] < target){
left = middle+1;
}else if(nums[middle] > target){
right = middle-1;
}else{
return middle;
}
}
return -1;
}
};
只更改了
int right = nums.size()-1;//right也在区间内,而c++数组从0开始
else if(nums[middle] > target){
right = middle-1;//middle>target不用再纳入[left,right]目标区间
}
LeetCode27. 移除元素
题目链接 27. 移除元素
双指针法
因为题目要求的输出可以是任意顺序,使用的是自己写的交换法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left = 0;
int right = nums.size() - 1;
while (left <= right){ //取等号则可以避免长度为0和1的数组出现问题
if(nums[left] == val){
swap(nums[left], nums[right]);
--right;
}else{
++left;
}
}
return left; //返回left在长度为0和1的数组时不会越界
}
};
快慢指针法
slow相当于用一个空数组记录fast遍历过的不等于val的数组
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
for(int fast = 0; fast < nums.size(); ++fast){
if(nums[fast] != val){
nums[slow++] = nums[fast];
}
}
return slow;
}
};