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

LeetCode 第704题 是一道最经典的使用二分法查找元素位置的题,这道题是一道非常基础的题,

它的核心是把数据分成2部分,算法的时间复杂度就减小。

这道题并没有我想象中那么好做 因为我之前没看题解的大体思路是对的,但是我考虑的方向是递归,但递归却无法正常调用 因为left ,right已经声明过了,所以没想出来,看了下题解发现直接用循环就可以。

题目链接:704. 二分查找 - 力扣(LeetCode)

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

        }
        return -1;
    }
};

对于向我这样的初学者来说,最重要的一点是把开闭区间弄懂,比如这道题可以用闭区间 ,也可以用开区间 ,开区间一般都是左闭右开。上面代码是闭区间 ,为什么上面的left ,right要进行+1,-1操作 因为在half位置上的值已经比较过了就不需要再次比较了。而开区间时就不用进行+1,-1等操作,因为就取不到 ,如果要像闭区间一样直接-1会遗漏数据因为是开区间取不到。

LeetCode 第27题 移除元素 

写这道题之前首先先要了解数组的删除操作的本质是什么,本质其实是覆盖,让后面的数据进行覆盖前面的数据这样就是数组的删除。

这道题可以用暴力法

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

这个题目暴力的解法就是两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组。

双指针法

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

定义快慢指针

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置

双指针法把两个for循环变成了一个效率极大的提升了。

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;
    }
};

这道题我写的时候是知道删除是覆盖的 但是确实想不出来 双指针法。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值