704. 二分查找
原题链接:https://leetcode.cn/problems/binary-search/
注意点:
目标值不在数组内:直接返回-1
循环终止条件:第一个值的下标小于等于最后一个值的下标
题解:
class Solution {
public int search(int[] nums, int target) {
// 左闭右闭法
int start = 0;
int end = nums.length-1;
// 提前判断target小于最小值或大于最大值
if (target<nums[0] || target > nums[nums.length-1]){
return -1;
}
while (start <= end){
int mid = (start+end)/2;
if(nums[mid] > target){
end = mid-1; // 如果target比第一个数还小,end=-1 < start=0,退出循环返回-1
}else if (nums[mid] < target){
start = mid+1; // 如果target比最后一个数还大,start>end,退出循环返回-1
}else {
return mid;
}
}
return -1;
}
}
27. 移除元素
原题链接:https://leetcode.cn/problems/remove-element/
注意点:
快指针和慢指针分别表示什么?
题解:
class Solution {
//快慢指针法
public int removeElement(int[] nums, int val) {
// 快指针用来获取新数组中的元素
// 慢指针是获取新数组中需要更新的位置 (可以想象慢指针指向一个虚空数组)
int slowIndex = 0;
for (int fastIndex=0;fastIndex<nums.length;fastIndex++){
if (val != nums[fastIndex]){ // 留下需要的元素
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
// 暴力破解法
public int removeElement(int[] nums, int val) {
int len = nums.length;
for (int i=0;i<len;i++){
if (val == nums[i]){ // 发现需要移除的元素时,将数组集体向前移动一位
for (int j=i+1;j<len;j++){
nums[j-1] = nums[j]; // 这样写的目的是避免下标越界
}
i--; // 因为当前的元素被删除了,再次循环时i+1,会跳过被删除元素的后面一位数
len--; // 长度-1
}
}
return len;
}
}