704.二分查找
点击查看代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
while(left<=right){
int middle=(right+left)/2;
if(nums[middle]>target){
right=middle-1;
}
else if(nums[middle]<target){
left=middle+1;
}
else{
return middle;
}
}
return -1;
}
};
- 实现问题:第一次写时不太清除,循环条件没写一致。
- 读后想法:1.本题的重点在于保证初始边界,循环条件和循环体的一致。
2.没有注意到细节问题。int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
在这个题中其实两种写法都可以,因为题中给定了n的范围[1, 10000],int的最大值为2147483647,远远超出了n的范围,left + right的最大值小于20000,不可能越界。
27.移除元素
点击查看代码
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];
slow++;
}
}
return slow;
}
};
- 实现问题:我居然返回值写成了
return val,改了老半天没找到,最后发现感觉自己是个傻子。slow一直指向不重复数组的后一位(或者理解成计数器也可以),所以返回slow即可。
- 读后想法:细心细心再细心
35.插入搜索位置
点击查看代码
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
int middle=left+(right-left)/2;
while(left<=right){
middle=left+(right-left)/2;
if(nums[middle]<target){
left=middle+1;
}
else if(nums[middle]>target){
right=middle-1;
}
else{
return middle;
}
}
if(nums[middle]>target){return middle;}
else{return middle+1;}//通过middle来判断
return middle;
}
};
- 实现问题:无
- 读后想法:遇到这种情况不要慌,要把情况进行分析,分别考虑几种情况,最后综合起来写代码,很快就能解决。如果只在脑子里乱想,是不会得出结果的。