LeetCode 704. 二分查找、LeetCode 27. 移除元素

LeetCode 704. 二分查找

题目链接:704. 二分查找

碰到的问题

刚开始写的时候,有几处问题,在此记录一下供大家参考。

  1. 把循环中判断的对象搞错了,在每一轮循环中,我们应该都需要比较taget和对应mid下标所在的元素,从而决定更新区间的断电值,而我搞成了对比midtagret
  2. 在写“左闭右开”的情况中,将right的值初始化错误了,在这种情况下“右开”,代表着不扫描这个端点位置的元素,所以应该初始化为nums数组的长度即可,而我错误的初始化为right = nums.size()-1;

代码实现

以下分别是左闭右闭和左闭右开的代码。

// 左闭右闭的写法 [left,right]
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int mid,right,left;
        left = 0,right = nums.size()-1;
        while(left<=right)
        {
            mid = (right+left)/2;
            if(nums[mid]>target)
                right = mid -1;
            else if(nums[mid]<target)
                left = mid + 1;
            else
                return mid;
        }
        return -1;
    }
};
// 左闭右开的写法[left,right)
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left,right,mid;
        left = 0;
        right = nums.size();
        while(left<right)
        {
            mid = (right+left)/2;
            if(nums[mid]>target)
                right = mid;
            else  if(nums[mid]<target)
                left = mid+1;
            else
                return mid;
        }
        return -1;
    }
};

总结

二分查找算法的重难点我认为就是定义区间的端点,一般有两种情况一种就是左闭右闭一种则是左闭右开。

  1. 在左闭右闭的情况下,我们每次都要扫描区间的两个端点,所以在这种情况下如果中间元素大于Target或者中间元素小于Target,那么我们对应的需要更新mid左边一个或者mid右边一个的位置。
  2. 在左闭右闭的情况下,我们每次都要扫描区间的左端点left,但是不扫描right,因此我们使用中间元素去比较目标值Target的时候,如果中间值大于Target,此时我们应当更新左区间的右端点,但是又因为我们不扫描右端点所以此时更新right的时候,直接等于right = mid即可,如果中间值小于Target,则更新left = mid+1

LeetCode 27. 移除元素

题目链接:LeetCode 27. 移除元素

碰到的问题

刚开始写的时候,有几处问题,在此记录一下供大家参考。

  1. 实现思路需要考虑的细节太多处处错,一开始我是使用暴力法,两个for循环进行遍历,外层控制遍历每一个元素,内层从等于val元素的位置开始循环,val元素位置后面的所有元素整体左移一个单位,这样完成删除。后面改成双指针法,直接判断不等于val的时候,用另一个指针赋值即可。

代码实现

#include<vector>
using namespace std;
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
		int i,len,j;
		j = 0;
		len = nums.size();
		for(i = 0;i<len;i++)
		{
			if(nums[i]!=val)
				nums[j++] = nums[i];
		}
		return j;
    }
};

总结

注意,在力扣中使用c++,vector如果发生越界则会报错,但是devc++不会。本题移除元素,重要的是思路,使用双指针法巧妙解题,数组元素不能真正删除,而是覆盖。

posted @ 2022-12-27 22:42  蠢蛋快跑  阅读(1157)  评论(0)    收藏  举报