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

704.二分查找

刚学完C,C++还没学太多,刚写的代码如下:

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

有两处错误及一处能优化的地方:
错误一:

int right = sizeof(nums) / sizeof(int) - 1;

sizeof(nums) 返回的是 nums 对象的大小,而不是 nums 向量中元素的数量。

C++ 中,sizeof 运算符返回的是对象或类型的字节大小。对于一个 std::vector<int> 对象来说,sizeof(nums) 返回的是 std::vector<int> 类对象的大小,而不是向量中包含的元素的个数。

正确写法:

int right = nums.size() - 1;

错误二:

int middle = (right - left) / 2;

当left更新为不为零的值时,该middle不是想要的中间位置。

正确写法:

int middle = left + (right - left) / 2;

待优化之处:

int middle = left + (right - left) / 2;

写在while循环中,简化代码。

修改后代码:

class Solution {

public:

    int search(vector<int>& nums, int target) {

        int right = sizeof(nums) / sizeof(int) - 1;

        int left = 0;

        while(left <= right)

        {

            int middle = left + (right - left) / 2;

            if(nums[middle] < target)

            {

                left = middle + 1;

            }

            else if(nums[middle] > target)

            {

                right = middle - 1;

            }

            else

            {

                return middle;

            }

        }

        return -1;      

    }

};

27.移除元素

这道题出奇的竟然会,思路和题解一样。但有可以优化的地方。

代码如下:

class Solution {

public:

    int removeElement(vector<int>& nums, int val) {

    int setPos = 0;

    int len = nums.size();

    for(int i = 0; i < len; i++)

    {

        if(nums[i] != val)

        {

            nums[setPos] = nums[i];

            setPos++;

        }

    }

    return setPos;

    }

};

待优化之处:

setPos++可以和nums[setPos] = nums[i]合并,写在一行:

nums[setPos++] = nums[i];

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值