题目链接:leetcode704.二分查找
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while(left <= nums[right])
{
int middle = (left + right) / 2;
if(target < middle)
{
right = middle - 1;
}
else if(target > nums[middle])
{
left = middle + 1;
}
else
{
return middle ;
}
}
return -1;
}
};
遇到的报错:时间超时
分析代码逻辑后,发现middle的定义放在while外,其值只会在循环开始之前计算一次,导致了时间超时。
解决方式:将middle
定义在while循环中,在每次迭代时重新计算。
可能会遇到的报错:整数溢出
middle = (left + right) / 2可能会导致整数溢出
解决方式:将定义修改为middle = left + (right - left) / 2
题目链接:leetcode27.移除元素
暴力解法:
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; j < size - 1; j++)
{
nums[j] = nums[j+1];
}
i--;
size--;
}
}
return size;
}
};
该暴力解法的时间复杂度为O(n^2),空间复杂度为O(1)
双指针法(快慢指针法):
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
int fastIndex;
int slowIndex = 0;
for(fastIndex = 0; fastIndex < size; fastIndex++)
{
if(val != nums[fastIndex])
{
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};
时间复杂度为O(n),空间复杂度为O(1),性能得到明显优化