二分查找对于数组题目来说是比较基础的题目了。切记二分查找有两个前提才可以进行二分查找,一是数组中不能有重复元素,二是数组中的是升序排列的。
二分查找的步骤如下,一定要谨记:
1.找到数组左右两个端点
2.找到中间点的值nums[middle]
3.通过middle与target的比较来更新左右端点,切记在更新的时候一定要注意边界问题,因为这是整数二分问题。
代码如下,还有题解
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
int result = -1;
while(left <= right){
int middle = (left + right)/2;
if(nums[middle] > target){
right = middle-1;
}
else if(nums[middle] < target){
left = middle+1;
}
else{
return result = middle;
}
}
return result;
}
};
leecode27.移除元素
朴素解法
class Solution {
// 第一种方法,暴力解题,时间复杂度O(n^2)
public:
int removeElement(vector<int>& nums, int val) {
//因为删除元素后,nums的大小并不改变,所以如果执意返回
//nums.size()的话,并不会改变数组状态,必须要严格地
//观察数组大小,截取返回地值
int size = nums.size();
for(int i = 0; i < size; i++){
if(nums[i] == val){
for(int j = i+1; j < size; j++){
//进行元素地平移
nums[j-1] = nums[j];
}
//每删减一个元素,都要有这样子地 *** 作
i--;
size--;
}
}
return size;
}
};
双指针解法,这个题目的双指针解法也是很奇妙的。它让快指针当碰见等于val的值时,慢指针停止移动,快指针继续找不等于val的值。等找到了,把不等于val的值赋值给慢指针,然后两个指针继续一起移动。当快指针扫过整个集合时,他俩之间的差值正好是需要删除的元素个数,然后直接返回慢指针就ok。然后图解可以看下
代码随想目录
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow_index = 0;
for(int fast_index = 0; fast_index < nums.size(); fast_index++){
//这里要着重讲解原理,因为一旦fast指针遇到等于val的值,他就往后跳就
//完事了,为什么呢,因为val是要被删除的,它只需要扎到不等于val的值,
//然后将值交还给慢指针就ok了。
//慢指针的移动方式是:当快指针碰见需要删除的值时他就停止移动,因为他
//要等快指针碰到不相同的值时将值赋给他
if(nums[fast_index] != val){
nums[slow_index++] =nums[fast_index];
}
}
return slow_index;
}
};
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)