LeetCode 704. 二分查找
class Solution {
public:
int search(vector<int>& nums, int target) {
int min=0;
int max=nums.size()-1;
while(min<=max){
int mid=(max-min)/2+min; //防溢出,等同于(min+max)/2
if(target>nums[mid]){
min=mid+1;
}else if(target<nums[mid]){
max=mid-1;
}else{
return mid;
}
}
return -1;
}
};
-
计算 mid = (min + max) / 2,当 min 和 max 很大时,它们的和可能会超出整数类型的表示范围,导致溢出错误。为了防止溢出,可以用(max- min ) / 2 min 替代(min + max ) /2 。(max- min ) / 2 + min和(min + max ) / 2两个是数学上的恒等式,先计算差值 max - min,再除以 2,可以避免溢出问题。
27. 移除元素 - 力扣(LeetCode)
- 暴力解法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int sum=nums.size();
//第一个for循环遍历有效数组
for(int i=0;i<sum;i++){
if(val==nums[i]){
//第二个for循环更新数组元素
for(int j=i+1;j<nums.size();j++){
nums[j-1]=nums[j];
}
i--;
sum--;
}
}
return sum;
}
};
- 快慢指针
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0;
for(int fast=0;fast<nums.size();fast++){
if(nums[fast]!=val){
nums[slow++]=nums[fast];
}
}
return slow;
}
};