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

文章介绍了两种LeetCode题目——704.二分查找的左闭右开和左闭右闭的C++解决方案,以及27.移除元素的双指针法和快慢指针法的C++实现。二分查找中讨论了位运算优化,移除元素的问题则展示了如何处理数组中特定值的删除。
摘要由CSDN通过智能技术生成

LeetCode704. 二分查找

题目链接 704. 二分查找
左闭右开

感觉和c++数组更合适

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

    }
};
左闭右闭
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-left)>>1);//用加法避免溢出
            if(nums[middle] < target){
                left = middle+1;
            }else if(nums[middle] > target){
                right = middle-1;
            }else{
                return middle;
            }
        }
        return -1;

    }
};

只更改了

int right = nums.size()-1;//right也在区间内,而c++数组从0开始
else if(nums[middle] > target){
                right = middle-1;//middle>target不用再纳入[left,right]目标区间
            }

LeetCode27. 移除元素

题目链接 27. 移除元素
双指针法

因为题目要求的输出可以是任意顺序,使用的是自己写的交换法

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int left = 0;
        int right = nums.size() - 1;
        while (left <= right){         //取等号则可以避免长度为0和1的数组出现问题
            if(nums[left] == val){
            swap(nums[left], nums[right]);
            --right;
            }else{
                ++left;
            }
        }
        return left;             //返回left在长度为0和1的数组时不会越界
    }

};
快慢指针法

slow相当于用一个空数组记录fast遍历过的不等于val的数组

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];
            }
        }
        return slow;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值