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

Posted by Zhuoqun on January 10, 2023

704. 二分查找

https://leetcode.com/problems/binary-search/
由于之前跟着Carl哥学了一阵二叉树,二叉树涉及到很多递归方面的知识。所以我下意识的就带入了递归的想法去做这道题。这道题写的也不是很轻松,在终止条件(也就是左闭右闭还是左闭右开)上面做了很多尝试。 这是我自己写的递归方式的二分查找。

class Solution {
public:
    int res = -1;
    void bs(vector<int>& nums, int start, int end, int target){
        int mid_index = (start+end)/2;
        if(start > end){
            res = -1;
        }
        else{
            if(nums[mid_index] < target){
                bs(nums,mid_index+1,end,target);
            }
            else if(nums[mid_index] > target){
                bs(nums,start,mid_index-1,target);
            }
            else{
                res = mid_index;
            }
        }
    }
    int search(vector<int>& nums, int target) {
        if((nums.size() == 1) && (nums[0] != target))
            return -1;
        bs(nums, 0, nums.size(), target);
        return res;
        
    }
};

这是看了讲解之后写的左闭右开的方法。

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

27.移除元素

https://leetcode.com/problems/remove-element/

我首先想到的办法是调用erase直接删除数值等于val的元素。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        for (auto i = nums.begin(); i != nums.end();++i) {
            if (*i == val) {
                nums.erase(i);
                i--;
            }
        }
        return nums.size();
    }
};

看到Carl在笔记里提示说使用双指针,我的第一反应是创建两个int指针跟踪,但看了给的答案,其实并没有那么复杂,用两个int来表示index就可以。快的指针一直从头走到尾,慢的指针只在 快指针所在的值不等于val的时候再在原本的数组上写下快指针当前的数值就可以。我照着写了一遍:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int p1 = 0;
        for(int p2=0; p2<nums.size(); p2++){
            if(nums[p2] != val){
                nums[p1] = nums[p2];
                p1++;
            }
        }
        return p1;
    }
};