代码随想录算法训练营第一天|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];

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-09 20:18:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-09 20:18:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-09 20:18:02       82 阅读
  4. Python语言-面向对象

    2024-06-09 20:18:02       91 阅读

热门阅读

  1. cocos入门8:向量叉乘

    2024-06-09 20:18:02       32 阅读
  2. Mybatis-plus 自动填充字段

    2024-06-09 20:18:02       29 阅读
  3. 345_C++_共享缓冲区管理类shared_buffer

    2024-06-09 20:18:02       27 阅读
  4. 在 Linux 使用 cron 定时执行任务的注意事项

    2024-06-09 20:18:02       34 阅读
  5. Linux_第五章_实验案例:用户和文件权限管理

    2024-06-09 20:18:02       35 阅读
  6. Linux fallocate工具用于预分配或释放文件空间的块

    2024-06-09 20:18:02       34 阅读