LeetCode-704.二分查找
【错误】第一遍提交的代码
- 主要错误点:
- 没弄清楚区间的定义导致:r 在定义处的赋值和 if 判断之后 r 的复制没有想清楚;
- 没有搞清楚判断循环结束的条件;
- 没有搞明白区间的定义,r 和 l 如何赋值,如何判断;
class Solution {
public int search(int[] nums, int target) {
int l = 0;
int r = nums.length - 1;
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
while (l <= r) {
int mid = (r + l) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[mid] < target) {
l = mid+1;
}
if (nums[mid] > target) {
r = mid+1;
}
}
return -1;
}
}
【正确】第二遍提交代码
- 搞清楚区间的定义,并判断左闭右开的区间范围,如何判断r 和 l 的赋值,以及while结束的条件;
class Solution {
public int search(int[] nums, int target) {
int l = 0;
int r = nums.length;
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
while (l < r) {
int mid = (r + l) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[mid] < target) {
l = mid+1;
}
if (nums[mid] > target) {
r = mid;
}
}
return -1;
}
}
LeetCode-27.移除元素
【正确】双指针一次AC!
- 因为不用考虑末尾的元素,所以只要保证
fast指针
每次有和val
相等的元素就跳过,然后赋值给slow指针
指向的元素即可。 - 代码随想录给出的是相向双指针,我用的是同向,测试了一下结果差不多。
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0, fast = 0;
while (fast < nums.length) {
if (nums[fast] == val) {
fast++;
continue;
}
nums[slow] = nums[fast];
fast++;
slow++;
}
return slow;
}
}