刷题第一天

代码随想录刷题第一天 | 704. 二分查找,27. 移除元素

704. 二分查找

题目链接:二分查找

这里使用二分法有前提就是得是有序数组,而且还得是无重复的数字,如果有重复的数字,二分法出来的结果应该就不会是唯一的。

第一种写法,左右都是闭区间

class Solution {
public:
    int search(vector<int>& nums, int target) {
        //写一下第一种情况,即middle 在【left,right】 都是闭区间
        int left =0;
        int right = nums.size()-1; 
        while(left<=right){     //由于是左闭右闭 所以这里left<=right
            int middle = left+((right-left)/2); //这样写防止溢出
            if(nums[middle]>target){
                right = middle-1;
            }
            else if(nums[middle]<target){
                left = middle+1;
            }
            else
                return middle;
        }
        return -1;
    }
};

第二种写法,左闭区间 右边是开区间 【left,right)


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); //这里做位运算,等价除以2
            if(nums[middle]>target){
                right = middle;
            }
            else if(nums[middle]<target){
                left =  middle+1;
            }
            else    
                return middle;
        }
        return -1;
    }
};

收获

第二种写法的那里,有个位运算,看leetcode 的运行速度,位运算好像快蛮多。

27. 移除元素

题目链接:27 移除元素
两种方法 1 暴力就完事了 2 双指针 快慢指针

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        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--;
            size--;
            }
           
        }
        return size;
    }
};

下一种聪明方法 :快慢指针

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

收获

写完看别人的介绍,才想起有 库函数可以直接用,完了,又得重新看这些知识,难受

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值