代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

题目 1:704. 二分查找

纯暴力解法

class Solution {
public:
    int search(vector<int>& nums, int target) {
        for(int i = 0; i<nums.size(); i++){
            if(nums[i]==target){
                return i;
            }
        }
        return -1;
    }
};

心路历程:这里注意return, 本来想在if下面加个else的,但其实逻辑不对,如果数组里第一个数不等于target那么就直接return-1了

 二分法

左闭右闭版[ , ]

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int start = 0; // 数组起始索引
        int end = nums.size()-1; // 数组终止索引
        while(start <= end)
        {
            int mid = (start + end) / 2;
            if (target > nums[mid])
            {
                start = mid + 1;
            }
            else if (target < nums[mid])
            {
                end = mid - 1;
            }
            else
            {
                return mid;
            }
        }
        return -1;
    }
};

心路历程:二分法区间的考虑真的很重要!!!如果start = mid; end = mid; 不进行+-1操作,那么可能导致死循环跳不出while循环(例:start=3;end=4;那么mid=3,如果nums不等于target那么一直进入循环)

左闭右开版[ , ) 

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int start = 0;
        int end = nums.size() - 1;
        // if(end==0){end=1;}
        if(nums[end]==target){return end;} // 修复bug 如用例 [3,5] val=5; [5] val=5;
        while(start < end)
        {
            int mid = (start + end) / 2;
            if(target > nums[mid])
            {
                start = mid + 1;
            }
            else if(target < nums[mid])
            {
                end = mid;
            }
            else
            {
                return mid;
            }
        }
        return -1;
    }
};

心路历程:其实左开又闭,仅需要 int end = nums.size();就能确保考察到数组最后一个元素了。

题目二:27. 移除元素

自己的解法(其实也是双指法)

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int count = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            if(nums[i] == val)
            { 
                count ++;  // 截至当前等于val元素个数
            }
            else
            {
                nums[i-count] = nums[i];  // 将当前不等于val元素  覆盖到重复元素所在位置
            }
        }
        return nums.size() - count;
    }
};

双指针法

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow = 0;
        for(int i = 0; i<nums.size(); i++)
        {
            if(nums[i] != val)
            {
                nums[slow] = nums[i]; // 如果当前元素不等于val 那么将当前元素赋值给慢指针
                slow ++; 
            }
        }
        return slow;
    }
};

心路历程:慢指针slow +1其实就是当前满足条件元素的个数,因此slow就应该是当前满足条件元素的索引位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值