Leetcode704.二分查找
1.思路
二分查找前提条件:有序数组,无重复条件(一但有重复元素,则返回下标不唯一)
两种写法:
写法一:前闭后闭
初始值 left=0,right=nums.size()-1; 循环条件为 while(left<=right); 当 target<nums[middle], 则right=middle-1; 若 target>nums[middle], 则left=middle+1。
写法二:前闭后开
初始值 left=0,right=nums.size(); 循环条件为while(left<right); 当target<nums[middle], 则right=middle; 若target>nums[middle], 则left=middle+1。
2.代码实现
前闭后开:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size();
while(left<right){
int middle=left+((right-left)/2);
if(nums[middle]>target){
right=middle;
}
else if(target>nums[middle]){
left=middle+1;
}
else{
return middle;
}
}
return -1;
}
3.复杂度分析
时间复杂度:O(log n)
空间复杂度:O(1)
4.思考
对于二分查找,首先得注意前提条件(数组有序,且无重复元素);其次要注意是哪种写法(前闭后闭还是前闭后开),不同的写法对于边界上的处理有所不同。
5.Reference:代码随想录
Leetcode27.移除元素
1.思路
方法一:暴力法
两层for循环,第一层循环用i遍历数组元素,当nums[i]==val时,利用第二层for循环更新数组
方法二: 双指针法
利用快慢指针在一个for循环中,完成两个for循环的任务
快指针:寻找新数组的元素,新数组就是不含目标元素的数组
慢指针:指向更新 新数组下标的元素
2.代码实现
暴力法:
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;
}
双指针法:
int removeElement(vector<int>& nums, int val) {
int slowindex=0;
int fastindex=0;
int size=nums.size();
for(;fastindex<size;fastindex++){
if(nums[fastindex]!=val){
nums[slowindex++]=nums[fastindex];
}
}
return slowindex;
}
3.复杂度分析
暴力法:
时间复杂度:O(n^2)
空间复杂度:O(1)
双指针法:
时间复杂度:O(n)
空间复杂度:O(1)