1.704二分查找
二分查找,一看就会,一写就废。二分查找的难点就是定义区间,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
左闭右闭写法:
class Solution {
public:
int search(vector<int>& nums, int target) {
int right = nums.size()-1;//数组从0开始,nums.size()取的是数组个数。
int left = 0;
int middle = left + (right - left) / 2;//防止溢出int的最大值
while (left <= right) {//左闭右闭允许left==right
if (nums[middle] == target) return middle;
else if (nums[middle] > target) {
right = middle-1;
middle = left + (right - left) / 2;
}
else {
left = middle+1;
middle = left + (right - left) / 2;
}
}
return -1;
};
左闭右开写法:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size(); // [left, right)
int middle = left + ((right - left) / 2);
while (left < right) { // left == right的时候,在[left, right)是无效的空间,所以使用 <
if (nums[middle] > target) {
right = middle;
} else if (nums[middle] < target) {
left = middle + 1; // target 在右区间,在[middle + 1, right)中
} else {
return middle;
}
}
// 未找到目标值
return -1;
}
};
2.27移除元素
快慢指针法:
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组。
- 慢指针:指向更新 新数组下标的位置。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fastIndex = 0;//查找元素
int slowIndex = 0;//更新数组
for (;fastIndex < nums.size();fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};