704.二分查找
// 704 二分查找
// 1.左闭右闭区间(使用比较熟练了,就不放注释了)
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) return mid;
else if (nums[mid] < target) left = mid + 1;
else if (nums[mid] > target) right = mid - 1;
}
return -1;
}
};
// 2.左闭右开区间
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size(); //开区间,取数组最后一个元素的后一位置
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] == target) return mid;
else if (nums[mid] < target) left = mid + 1; // 左闭
else if (nums[mid] > target) right = mid; // 右开
}
return -1;
}
};
// tips 代码随想录采用了位运算来代替除法运算,其实现方式是使用了位运算,比直接除2的方式更高效。
int middle = left + ((right - left) >> 1);
int middle = left + (right - left) / 2;
/*
上述代码在计算 (right - left) / 2 的时候,如果 right 和 left 都是非常大的数,
有可能会导致溢出的问题。为了解决这个问题,我们可以将其改为使用位运算的方式进行计算
*/
27.移除元素
// 27.移除元素
// 本题要求了空间复杂度为O(1),不允许引入额外空间
// 之前刷过本题,但今天再刷一边感觉感觉又有了新的收获
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
for (int fast = 0; fast < nums.size(); fast++) {
// 无论内部循环如何,fast每次都要递增
if (nums[fast] != val) {
nums[slow] = nums[fast]; // 只要fast的元素不等于val,就用它去替换slow的元素
slow++;
}
}
return slow; // 最后这里的返回值一定要思考是slow还是slow + 1
}
};