二分查找:
初步题解
class Solution {
public:
int search(vector<int>& nums, int target) {
int j = -1;
for(int i = 0 ; i < nums.size(); i++){
if(nums[i] == target){
j = i;
}
}
return j;
}
};
二次题解:
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){
left = middle + 1;
}
else if(nums[middle] > target){
right = middle;
}
else{
return middle;
}
}
return -1;
}
};
核心还是想清楚,当如果right = middle - 1 的情况下,那么因为是左闭右开的缘故,就取不到value[middle-1]的值(只能取到它左边一位的值)。同时左闭右开右边为right=nums.size()而不是nums.size()-1;是比正常的数组长度多了一位的,这是左闭右开的核心。
移除元素
双指针法,不一定是双for循环,核心是nums[j++]
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int length = nums.size();
int j = 0;
for(int i = 0;i < length;i++){
if(nums[i] != val){
nums[j++] = nums[i];
}
}
return j;
}
};