前言
一、LeetCode: 704.二分查找
二、LeetCode: 27.移除元素
总结
前言
704. 二分查找
思路
首先需要知道二分查找的前提是数组有序。
其次是在二分的过程中区间保持一致,比如都保持左闭右开或者左闭右闭。
- 第一步二分整个数组,确定区间的左右边界。
- 在循环中比较,每次判断目标值与当前区间中值的大小
- 根据不同大小情况,更新边界,最终找到目标值
class Solution {
public int search(int[] nums, int target) {
//左闭右闭
int l = 0, r = nums.length - 1;
while (l <= r) {
//区间中值
int mid = l + (r - l) / 2;
if (nums[mid] > target) r = mid - 1;
else if (nums[mid] < target ) l = mid + 1;
else return mid;
}
return -1;
}
}
移除元素
题目链接
思路
知道数组中的元素是无法删除的,只能通过其他元素覆盖该位置。
第一思路
暴力算法
- 遍历整个数组,如果当前元素为待删除的值。
- 在定义一个for循环,将后面的所有元素往前移一位,完成元素的删除。
- 完成后,将当前指针向前移动,并将数组长度减一。
class Solution {
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 --;
size --;
}
}
return size;
}
}
双指针优化
- 定义快慢指针,快指针指向新数组的元素,慢指针指向待删除的位置
- 快指针遍历数组,遇到非待删除元素,将其更新到慢指针的位置,慢指针+1
- 最后慢指针的值就是新数组的长度。
class Solution {
public int removeElement(int[] nums, int val) {
int slowIndex = 0;
for (int fastIndex = 0;fastIndex < nums.length; fastIndex ++) {
if (nums[fastIndex] != val) {
nums[slowIndex ++] = nums[fastIndex];
}
}
return slowIndex;
}
}