-
LC704 二分查找 leetcode.com/problems/bi…
-
是什么
- 在有序数组中,通过比较中间值与目标值大小,缩小一般搜索空间。
-
为什么
- 可以将时间复杂度缩小至log(N)
-
怎么做(见代码)
- 左闭右闭
- 左闭右开
- mid值防止溢出:mid = left+(right-left)/2;
-
注意什么 闭合空间选择,index的定义要和区间选择保持一致性
-
//[left,right]
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length -1;
//闭合区间 <=
while(left<=right){
int mid = left + (right-left)/2;
if(nums[mid]>target){
//右闭:因为mid已经>target,不用保留
right = mid - 1;
}else if(nums[mid]<target){
//左闭:因为mid已经<target,不用保留
left = mid + 1;
}else{
return mid;
}
}
return -1;
}
//[left,right)
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length;
//闭合区间 <=
while(left<right){
int mid = left + (right-left)/2;
if(nums[mid]>target){
//右开:要保留一个大于的值。如果相同则不合理。EX:[1,1)
right = mid;
}else if(nums[mid]<target){
//左闭:因为mid已经<target,不用保留
left = mid + 1;
}else{
return mid;
}
}
return -1;
}
}
}
-
LC27 移除元素
-
是什么
- 在数组或链表中按不同步长移动,通过限制结束条件解决问题
-
为什么
- 数组链表中,通过快指针的反馈迭代慢指针。
-
怎么做
- 见代码
-
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0, fast = 0;
for( fast = 0; fast<nums.length;fast++){
if(nums[fast]!=val) {
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}