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

搭建vscode leetcode刷题环境

之前基本是使用python进行编程,但是这一次报班想要学习算法的同时也重新捡起来C++(在之前接触过C++,但是时间久远,忘差不多了)。搭建环境主要参考了以下这些文章和视频:https://zhuanlan.zhihu.com/p/87864677/?utm_id=0https://www.bilibili.com/video/BV1uN4y1d7Lj/?spm_id_from=333.788.recommend_more_video.0&vd_source=9feeab88b4561eb90337e51a478752d3

704.二分法

采用了闭区间的写法,在计算middle的时候没有考虑到溢出的问题,可以根据老师的思路加以改进

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 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 middle;
            }
        }
        return -1;
        
        
    }
};

27.移除元素

一开始使用暴力解法做出来了,对于快慢指针的运用,虽然脑子里有这个想法,但是不知道如何付诸代码实践,学习卡哥解法思路之后明白了写法

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow = 0;
        for (int fast = 0 ;fast < nums.size(); fast++) {
            if (nums[fast] != val) {
                nums[slow] = nums[fast];
                slow++;
            }
            
        }
        return slow;
        // 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--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
        //         size--; // 此时数组的大小-1
        //     }
        // }
        // return size;
    }
};

你可能感兴趣的:(leetcode,算法)