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

205 阅读1分钟

学习资料链接

programmercarl.com/%E6%95%B0%E…

704.二分查找

第一想法

二分查找在很多教程中都看过,解题的思路是有的,于是直接在leetcode中写了起来,第一次提交,结果错误,发现由于人比较迷糊,返回了nums[middle],重新提交后发现超时,第一次提交源码如下:

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

        }
        return -1;

    }
};
看完随想录的收获

完美的击中了我犯得所有错误,两个重要的知识点记录如下:

  1. 注意整数越界问题.
  2. 数组边界问题的两种写法.
重新提交版

左闭右闭

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

    }
};

左闭右开

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

    }
};

35.搜索插入位置

提交解法
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int low = 0;
        int high = nums.size() - 1;
        if (target > nums[high]) {
            return high + 1;
        }
        if (target < nums[low]) {
            return 0;
        }
        while (low <= high) {
            
            int middle = low + (high - low) / 2;

            if ( nums[middle] > target) {
                high = middle - 1;
            } else if ( nums[middle] < target) {
                low = middle + 1;
            } else {
                return middle;
            }
        }
        return low;

    }
};
注意点和需要优化的地方
  1. 最终返回low
  2. 前面两个if实际上可以在下面中体现,参考官方题解的方法.

27. 移除元素

第一想法

第一想法是遍历数组,然后看元素是否等于目标值,如果不等于就加入新数组中,但是仔细看题目发现不让用额外的空间,于是如下: 遍历数组,然后元素是否等于目标值,如果等于的话,从这个元素开始往后寻找,找到的第一个不等于目标值的元素,两者交换,并且一旦找到就停止

第一次提交
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int temp = 0;
        int count = 0;
        for(int i = 0; i < nums.size(); i++) {
            if (nums[i] == val){
                for(int j = (i+ 1); j < nums.size(); j++){
                    if (nums[j] != val) {
                        temp = nums[i];
                        nums[i] = nums[j];
                        nums[j] = temp;

                        break;
                        

                    }

                }
            }

        }
        for(int i = 0; i < nums.size(); i++) {
            if (nums[i] != val) {
                count++;
            }
        }
        return count;
        

    }
};
看完题解后的收获

看到题解双指针仨字的时候,就突然想起来咋做了,有点子尴尬....

今日份收获

两个套路:

  1. 数组边界的确定
  2. 双指针