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