数组
704:二分查找
左闭右闭:[left,right]
*int* search(vector<*int*>& *nums*, *int* *target*) {
int left=0;
int right=nums.size()-1;
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]<target){
left=mid+1;
}else if(nums[mid]>target){
right=mid-1;
}else{
return mid;
}
}
return -1;
}
左闭右开:[left,right)
*int* search(vector<*int*>& *nums*, *int* *target*) {
int left=0;
int right=nums.size()-1;
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid]<target){
left=mid+1;
}else if(nums[mid]>target){
right=mid;
}else{
return mid;
}
}
return -1;
}
总结:已经可以熟练的写两个不同方法的二分查找了,左闭右闭和左闭右开的left都属于闭区间,因此改变时都是left=mid+1。易错的是,左闭右开的righ初始值应定义为nums.size(),且由于右开right=mid。
27:移除元素
思路一: 暴力解法
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 + 1; j < size; j++) {
nums[j - 1] = nums[j];
}
i--;
size--;
}
}
return size;
}
思路二:双指针法
理解:遍历数组,把不等于val的元素重新赋值给数组nums。
int* removeElement(vector<*int*>& *nums*, *int* *val*) {
*int* i=0;
*int* j=0;
for(i=0;i<nums.size();i++){
if(nums[i]!=val){
nums[j++]=nums[i];
}
}
return j;
}