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

704. 二分查找

文档讲解:https://programmercarl.com/0704.二分查找.html
状态:独立实现

思路

二分查找是一个很经典的题目,遇到按大小排序的数组且元素不重复,基本都可以使用二分查找法,他的精髓就是双向指针,要注意的是对于区间“=”的判断。
时间复杂度:O(log n),空间复杂度:O(n)

代码随想录思路

其实基于对于区间开闭的选择有两种方法可以解决这个问题,不过我还是喜欢使用感觉更常规化的右指针指向nums.size()-1的方法。

实现过程中的困难

这题太经典了,没有困难

收获

这道题耗时0.5小时。时间复杂度的计算有些忘了,每次写代码要记得自己计算一下,面试时候还是会有被问到的可能的。

实现代码

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int num_size=nums.size();
        int left_point=0;
        int right_point=num_size-1;
        int result_point=(left_point+right_point)/2;
        for(int result_point=(left_point+right_point)/2;left_point<=right_point;result_point=(left_point+right_point)/2){
            if(nums[result_point]>target){
                right_point=result_point-1;
            }
            else if(nums[result_point]<target){
                left_point=result_point+1;
            }
            else if(nums[result_point]==target){
                return result_point;
            }
        }
        return -1;
    }
};

27.移除元素

文档讲解:https://programmercarl.com/0027.移除元素.html
状态:没做出来

思路

对于这道题也有考虑过两个指针实现,但是对于指针什么时候++和赋值脑子一团浆糊,最后只能看了解析。

代码随想录思路

对于这道题可以使用快慢指针和双向指针两种方法实现,本质都是通过循环用不为val的元素来覆盖等于val的元素,直到数组中所有元素都被判断并处理过。
时间复杂度:O(n),空间复杂度:O(1)

实现过程中的困难

大概的思路有,但是对于具体指针的处理还是很迷糊,下次画个示意图可能会好很多。

收获

这道题耗时1小时。对于复杂一点的算法题不能光靠脑子想,在纸上做个简单的模拟可能会拓宽思路。

实现代码

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int quick_point=0,slow_point=0;
        for(;quick_point<nums.size();quick_point++){
            if(val!=nums[quick_point]){
                nums[slow_point]=nums[quick_point];
                slow_point++;
            }
        }
        return slow_point;
    }
};
posted @ 2024-01-24 22:28  冰小呱  阅读(11)  评论(0)    收藏  举报