代码随想录算法训练营Day01|704. 二分查找、27. 移除元素
704. 二分查找
首先注意题干的描述:
- 题干描述说明了元素是升序排列的,否则需要调用
sort
进行手动排序 - 另外
提示
中说明元素不重复,因此不空考虑二分查找多解的情况。
说回题目本身,重点在于二分查找边界和遍历时终止的条件之间的匹配。
简单总结来说就是“左闭右开不相等,左闭右闭要相等。”
题解如下:
①左闭右开
class Solution {
public:
int search(vector<int>& nums, int target) {
int len = nums.size();
// cout << len << endl;
int left = 0, right =len, mid;
while (left < right) {
mid = (left + right) / 2;
if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid;
else
return mid;
}
return -1;
}
};
②左闭右闭
class Solution {
public:
int search(vector<int>& nums, int target) {
int mid, len = nums.size();
int left = 0, right = len - 1;
while (left <= right) {
mid = (left + right) / 2;
if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid - 1;
else
return mid;
}
return -1;
}
};
27. 移除元素
题干要求空间复杂度为O(1),这意味着我们必须再原数组上进行删减和修改,不能再开辟新的存储空间。
思路是利用快慢指针的方法:
-
快指针:负责遍历原数组,寻找与
target
不相等的数据元素。 -
慢指针:负责对原数组进行原地修改,将快指针找到的不等元素重新赋值给数组。
因为慢指针始终慢于/齐平于快指针,所以慢指针修改的下标位置必定已经被快指针筛选过。
代码如下:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
// 快慢指针原地修改数组
int fast = 0, slow = 0;
while (fast < nums.size()) {
if (nums[fast] != val) {
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
};
标签:二分,27,nums,int,元素,随想录,查找,移除,指针
From: https://www.cnblogs.com/buryinshadow/p/16897507.html