704.二分查找
根据区间的不同,主要有两种常见的解法,我首先想到的也是最常见的定义target在一个左闭右闭的空间,代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while(left <= right){
int middle = (right - left) / 2 + left;//防止溢出
int num = nums[middle];
if (num == target) {
return middle;
} else if (num > target) {
right = middle - 1;
} else {
left = middle + 1;
}
}
return -1;
}
};
值得注意的点是:
因为定义target存在于[left,right],while里的条件需要写left <= right,而不是left < right
定义中位数时,应定义(right - left) / 2 + left,等同于(left + right)/2,这样做是为了防止溢出
第二种方法是target在一个左闭右开的区间,这时候while里的条件就要有所区别了,因为右边是开区间,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);
if (nums[middle] > target) {
right = middle;
} else if (nums[middle] < target) {
left = middle + 1;
} else { // nums[middle] == target
return middle;
}
}
return -1;
}
};
27.移出元素
首先想到的是暴力解法,开始我使用了两个for循环,运行结果报错,没有通过所有的案例,查了下原因,简单使用两for循环只能把target值覆盖掉,而不能把他删除,修改了下,然后通过了。代码如下:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int lenght = nums.size();
int j = 0;
for(int i = 0;i < lenght;i++)
{
if(nums[i] != val)
{
nums[j] = nums[i];
j++;
}
}
return j;
}
};
除了暴力解法,还可以使用双指针法来通过这道题:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};