目录
前言:
目标的设立是伟大的,实现的过程是痛苦的。善始善终,愿君共勉。
题1:LeetCode704 二分查找
指路:704.二分查找
代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
//左闭右闭的区间
int left = 0, right = nums.size() - 1; // 包含最后元素
while (left <= right) // 左闭右闭可以相等,例如[1, 1]
{
int middle = (left + right) / 2; // 中间元素
if (nums[middle] > target) // 目标在左区间和中间值之间
// 这个时候要改变右区间,使其在中间
right = middle - 1; // 最初已经包含了最右值,这里的判断中间值不与目标值相等
else if (nums[middle] < target) // 目标在中间值和右区间之间
// 这个时候要改变左区间,使其在中间
left = middle + 1; // 最初包含最左值,这里判断中间值不与目标值相等
else return middle; // 找到了等值,返回
}
return -1; // 未找到target,返回-1
}
};
注意:
题目中的区间范围应当一以贯之,例如最初是左闭右闭区间则应全程都是左闭右闭。而左闭右闭区间还需要与左闭右开或左开右开区间区分最初的right,中间的left和right的取值范围。
本题中左闭右闭的情况如上。当题目中的区间情况为左闭右开时,right的初始定义即为nums.size(),while循环体中间的right应当定义为middle,因为右开时,右值不在既定范围内。
题2:LeetCode27 移除元素
指路:27.移除元素
代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0, fast = 0; // 定义快指针和慢指针
for (fast = 0; fast < nums.size(); fast++) { // 快指针遍历数组获取删除元素后新数组的元素
if (nums[fast] != val) { // 如果快指针指向的元素和指定元素不相等
nums[slow] = nums[fast]; // 快指针的值赋给慢指针指向的位置
slow++; // 慢指针指向的位置自增
}
}
return slow; // 返回慢指针指向
}
};
思路:
连续的数组内存不允许更改,所以我们用双指针解决问题。双指针为快慢指针,快指针用来遍历给定数组,获取删除给定元素后新数组的元素,并将其赋值给慢指针指向的位置。最后返回慢指针。函数代换:erase。