LeetCode 704.二分查找
思路:题目直接指定了查找的方式是“二分查找”,那么就直接使用二分查找解决问题即可。
代码:
class Solution {
public int search(int[] nums, int target) {
if (nums.length == 0) {
return - 1;
}
return search(nums, target, 0, nums.length);
}
public int search(int[] nums, int target, int start, int end) {
if (start >= end) {
return -1;
}
int mid = start + (end - start) / 2;
int index;
if (target < nums[mid]) {
index = search(nums, target, start, mid);
} else if (target > nums[mid]) {
index = search(nums, target, mid + 1, end);
} else {
index = mid;
}
return index;
}
}
遇到的困难:实现的过程比较直接,首先定义递归函数的参数和返回值;然后定义递归函数的出口条件;最后实现单层递归逻辑。主要是对于边界情况的把握和对于“左闭右开”原则的使用。
LeetCode 27.移除元素
题目链接:27.移除元素
思路:
(1)直接删除,但是满足不了只能使用O(1)的额外空间的题目要求。
(2)使用双指针,交换目标元素与其他元素的位置,放到数组的末尾。
代码:
class Solution {
public int removeElement(int[] nums, int val) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
if (nums[left] != val) {
left++;
continue;
}
if (nums[right] == val) {
right--;
continue;
}
swap(nums, left, right);
}
return left;
}
public void swap(int[] nums, int left, int right) {
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
}
}
遇到的困难:实现的时候while条件里面写的是`left < right`,这样就导致没有覆盖到一个边界case,当数组中只有一个元素,同时val不在数组中,这个时候left不会更新,导致返回的left为0,leetcode检查结果的时候就会判错。
正确的做法是,`while (left <= right)`,这样就可以在只有一个元素的基础上也能都移动left。