思路:
左开右闭:
定义左右指针,并且取一个中间值mid,这里要我喜欢用左闭右闭原则,因此 while循环的退出条件为:left <= right,mid为 left + (right- left)/2 这样写是为了防止越界 当nums[mid] == target时,我们就直接返回mid,就是target的位置了 当nums[mid] < target时,说明target是在左边这一部分,所以[left, mid – 1]。 当nums[mid] > target 时,说明target是在右边这一部分,所以[mid + 1, right]
代码:
class Solution {
public int search(int[] nums, int target) {
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
// 左边指针
int left = 0;
// 右边指针
int right = nums.length - 1;
// 中间值
int mid;
// 循环,退出条件为:<= 因为左闭右闭原则 while (left <= right) { mid = left + ((right - left) >> 1);
// 等于target的情况
if (nums[mid] == target) {
return mid;
}
else if (nums[mid] < target) {
left = mid + 1;
}else {
right = mid - 1;
}
}
return -1;
}
}
27.移除元素
题目:27.移除元素
文档讲解:代码随想录-27.移除元素
视频讲解:哔哩哔哩-27.移除元素
状态/时间:没写出来/四十分钟
法一:暴力解法
思路:
可以用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--;
size--;
}
}
return size;
}
}
法二: 快慢指针
思路:
用快指针来当循环,当快指针的值不等于删除的值(val)的时候,就把块指针的值,赋值到慢指针;
当快指针遇到val时,慢指针就停下来,然后快指针继续走,遇到不是val的时候,把快指针的值,赋值到慢指针,这样val就成功覆盖删除了。
最后返回慢指针,就是数组的长度以及删除val后的数组了
代码:
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;
}
}
注意:
直接在for循环定义快指针就好, 不要定义i,然后在这个循环里面再来写fast slow,这样代码就变得更复杂。
————————————————