704. 二分查找
题目链接:二分查找
这里使用二分法有前提就是得是有序数组,而且还得是无重复的数字,如果有重复的数字,二分法出来的结果应该就不会是唯一的。
第一种写法,左右都是闭区间
class Solution {
public:
int search(vector<int>& nums, int target) {
//写一下第一种情况,即middle 在【left,right】 都是闭区间
int left =0;
int right = nums.size()-1;
while(left<=right){ //由于是左闭右闭 所以这里left<=right
int middle = left+((right-left)/2); //这样写防止溢出
if(nums[middle]>target){
right = middle-1;
}
else if(nums[middle]<target){
left = middle+1;
}
else
return middle;
}
return -1;
}
};
第二种写法,左闭区间 右边是开区间 【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); //这里做位运算,等价除以2
if(nums[middle]>target){
right = middle;
}
else if(nums[middle]<target){
left = middle+1;
}
else
return middle;
}
return -1;
}
};
收获
第二种写法的那里,有个位运算,看leetcode 的运行速度,位运算好像快蛮多。
27. 移除元素
题目链接:27 移除元素
两种方法 1 暴力就完事了 2 双指针 快慢指针
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+1 ; j < size ; j++ ) {
nums[j-1] = nums[j];
}
i--;
size--;
}
}
return size;
}
};
下一种聪明方法 :快慢指针
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowindex = 0;
for(int fastindex = 0;fastindex<nums.size();fastindex++){
if(nums[fastindex]!=val){
nums[slowindex++]=nums[fastindex];
}
}
return slowindex;
}
};
收获
写完看别人的介绍,才想起有 库函数可以直接用,完了,又得重新看这些知识,难受