LeetCode704. 二分查找
题目链接:二分查找
文档讲解:代码随想录
思想:主要分为左闭右闭和左闭右开
左闭右闭代码:
public int search(int[] nums, int target) {
int left=0;
int right=nums.length-1;
int mid=(left+right)/2;
while(left<=right){
if(nums[mid]<target){
left=mid+1;
mid=(left+right)/2;
}else if(nums[mid]>target){
right=mid-1;
mid=(left+right)/2;
}else{
return mid;
}
}
return -1;
}
左闭右开:(假定目标值是在[left,right)中,也就是right为nums.length,此时rigth值是无意义的)
public int search(int[] nums, int target) {
int left=0;
int right=nums.length;
int mid=(left+right)/2;
while(left<right){// 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
if(nums[mid]<target){
left=mid+1;// target 在右区间,在[middle + 1, right)中
mid=(left+right)/2;
}else if(nums[mid]>target){
right=mid;// target 在左区间,在[left, middle)中
mid=(left+right)/2;
}else{
return mid;
}
}
return -1;
}
LeetCode27. 移除元素
题目链接:移除元素
文档讲解:代码随想录
思想:主要有暴力循环和快慢双指针两种思路
暴力循环
两个for循环,外层循环遍历数组 在需要需要移除的元素时,通过判断条件进入内部循环整个搬动后续数组向前移动。
public int removeElement(int[] nums, int val) {
int size=nums.length;
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--;// 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
size--;// 此时数组的大小-1
}
}
return size;
}
时间复杂度:O(n^2) 空间复杂度O(1)
双指针(快慢指针)
用快慢指针代替两层for循环的操作,快指针的值不为目标值时,慢指针跟上并重新赋值数组,该操作会改变原有数组,但不会改变原有元素的相对位置。
public int removeElement(int[] nums, int val) {
//快慢指针
int slowIndex = 0;
for(int fastIndex =0;fastIndex<nums.length;fastIndex++){
if(val!=nums[fastIndex]){
nums[slowIndex++]=nums[fastIndex];
}
}
return slowIndex;
}