代码随想录算法训练营day01 | 704. 二分查找、27. 移除元素
704. 二分查找
视频教程:https://www.bilibili.com/video/BV1fA4y1o715/
左闭右闭,右指针
左闭右闭,初始化为nums.length - 1,循环条件为left <= right,迭代为mid +/- 1
左闭右开,,右指针初始化为nums.length,循环条件为left < right,
//左闭右闭,右指针初始化为nums.length - 1,循环条件为left <= right,迭代为mid +/- 1
public static int search(int[] nums, int target) {
//题目已经说明nums.length不为空,长度在[1, 10000]
//声明左右两个指针
int left = 0;
int right = nums.length - 1;
//左右指针交叉时循环结束
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] < target) {
left = mid + 1;//注意要增加一个偏移量
} else if (nums[mid] > target) {
right = mid - 1;
} else {
return mid;
}
}
return -1;
}
//左闭右开,,右指针初始化为nums.length,循环条件为left < right,
public static int search(int[] nums, int target) {
//题目已经说明nums.length不为空,长度在[1, 10000]
//声明左右两个指针
int left = 0;
int right = nums.length;
//左右指针交叉时循环结束
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid;
} else {
return mid;
}
}
return -1;
}
27. 移除元素
视频链接:https://www.bilibili.com/video/BV12A4y1Z7LP/
我的思路:遍历,找到对应值删除并将其后元素前移(双层for循环暴力破解)
优化思路:快慢指针,快指针查找可用值,赋给慢指针,时间复杂度O(n)
//快慢指针
public int removeElement(int[] nums, int val) {
// f为快指针,s为慢指针
int s = 0;
for (int f = 0; f < nums.length; f++){
if(nums[f]!=val){
nums[s]=nums[f];
s++;
}
}
return s;//恰好等于新数组长度
}
总结
1、二分查找重点在于明确边界定义
2、快慢指针可以降低时间复杂度