LeetCode:704_二分查找
问题描述
找出给定升序数组nums的目标值target,如果存在返回下标,否则返回-1。
链接:https://leetcode.cn/problems/binary-search/description/
解决方案:
1.思路
二分法基本思路
2.代码实现
class Solution {
public int search(int[] nums, int target) {
int l = 0;
int r = nums.length-1;
while(l <= r){
int mid = (r-l)/2 + l;
int num = nums[mid];
if(target == num){
return mid;
}
else if(target > num){
l = mid+1;
}
else{
r = mid-1;
}
}
return -1;
}
}
3.复杂度分析
时间复杂度:如果有n个待处理数据元素,每次比较后待处理数据减半,故时间复杂度为 O l o g ( n ) Olog(n) Olog(n);
空间复杂度:
4.注意
- 注意左闭右开,左闭右闭的情况区分;
- 若数组长度取值范围较大,计算中间值mid的时候, m i d = l + r 2 mid=\frac{l+r}{2} mid=2l+r可能超出 int 类型的取值范围,从而导致计算错误。此时,需使用 m i d = l + r − l 2 mid=l+\frac{r-l}{2} mid=l+2r−l计算中点,避免此问题。
- 记得循环最外面的一层代码,要return -1,表示没有找到;
- 记得二分法的使用前提是有序数组
5.疑问
LeetCode:27_移除元素
问题描述
- 移除给定无序有重复数组nums的指定元素val;
- 要求只使用 O ( 1 ) O(1) O(1)的空间复杂;并原地修改数组;
- 要求对移除元素之后的数组进行排序,并输出
解决方案:
1.思路:使用快慢指针
- 快指针:记录新数组元素的数据值 ;实际上是for循环的一个一个移动
- 慢指针:新数组元素的下标值
2.代码实现
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
for(int fast=0;fast<nums.length;fast++){
if (nums[fast]!=val){
nums[slow++] = nums[fast];
}
}
return slow;
}
}
3.复杂度分析
- 时间复杂度: 快指针在for循环中遍历,遇到val的元素跳过(相当于删除),遇到不等于val的元素,赋值给慢指针指向的“坑🕳”;
- 空间复杂度:原地修改为 O ( 1 ) O(1) O(1)。
4.疑惑思考
是否所有的双层循环都可以用快慢指针去解决呢?