代码随想录算法训练营二刷day1| 704. 二分查找、27. 移除元素
LeetCode 704题 二分法查找
题目链接: 704.二分法查找
代码实现
class Solution {
public:
int binarySearch(vector<int>& nums, int left, int right, int target) {
while(left <= right) { //此处定义左闭右闭区间
int mid = left + (right - left) / 2; //取有序数组中间下标,这样处理的目的是防止数据溢出
if(nums[mid] < target) { //当中间值小于查找值,更新查找区间为mid右边区间
left = mid + 1;
binarySearch(nums, left, right, target);
}
else if(nums[mid] > target) { //当中间值大于查找值,更新区间为mid左边区间
right = mid - 1;
binarySearch(nums, left, right, target);
}
else //说明此时中间值等于查找值
return mid;
}
return -1; //当区间左值大于右值,说明数组中不存在查找值
}
int search(vector<int>& nums, int targrt) {
return binarySearch(nums, 0, nums.size() - 1, target);
}
};
本题小结
二刷本题,首先想到的是递归方式解题,对比一刷解题思路发现其实只需要一个while循环即可。
class Solution {
public:
int search(vector<int>& nums, int targrt) {
int left = 0, right = nums.size() - 1;
while(left <= right) { //此处定义左闭右闭区间
int mid = left + (right - left) / 2; //取有序数组中间下标,这样处理的目的是防止数据溢出
if(nums[mid] < target) { //当中间值小于查找值,更新查找区间为mid右边区间
left = mid + 1;
}
else if(nums[mid] > target) { //当中间值大于查找值,更新区间为mid左边区间
right = mid - 1;
}
else //说明此时中间值等于查找值
return mid;
}
return -1; //当区间左值大于右值,说明数组中不存在查找值
}
};
LeetCode 27题 移除元素
题目链接: 27.移除元素
代码实现
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for(int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if(nums[fastIndex] != val)
nums[slowIndex++] = nums[fastIndex];
}
return slowIndex;
}
};
本题小结
二刷此题,有两点需要注意:
- 为保证O(1)的空间复杂度,考虑使用双指针法,据题意,同向快慢双指针即可,根据判断条件用快指针替代慢指针上的元素;
- 同时需要返回数组大小,虽然慢指针从零开始,但是在替换过程中涉及慢指针的自增操作,所以最后的返回值不需要加一(逻辑上的细节问题需要多思考),在后面的回溯算法中同样需要思考(需要进行减一操作)
LeetCode 35题 搜索插入位置
题目链接: 35.搜索插入位置
代码实现
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while(left <= right) {
int mid = left + (right - left) / 2;
if(nums[mid] < target) {
left = mid + 1;
}
else if(nums[mid] > target) {
right = mid - 1;
}
else
return mid;
}
return right + 1; //此处是关键,由例子推理可得,当退出循环时,要么left = right, 要么left > right,此时取较小值的右边一位再加一作为在数组中的序号
}
};
本题小结
此题思路和二分查找一样,最后返回的值有一个细节需要处理!