1.二分查找法:
- 题目:力扣704 简单题
- 两种解法:1:左闭右闭区间 2.左闭右开区间
方法(1)左闭右闭
public int search(int[] nums, int target) {
//方法一:左闭右闭的区间
int left =0;
int right = nums.length- 1;
int middle;
while(left <= right)
{
middle = (right+left)/2;
if(nums[middle] == target){
return middle;
}
if(nums[middle] < target){
left = middle + 1;
}
else{
right = middle -1;
}
}
return -1;
方法(2)左闭右开
class Solution {
public int search(int[] nums, int target) {
//方法二 :左闭右开的区间
int left = 0;
int right = nums.length;
int middle;
while(left < right){
middle = (left + right) /2;
if(nums[middle] == target){
return middle;
}
if(nums[middle] > target){
right = middle;
}
else{
left = middle + 1;
}
}
return -1;
}
}
总结:两张方法的区别
类似的题:力扣第35题
题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。
思想:本题明确要求使用二分法查找。由于二分法中,索引表示的就是分解的位置。最终的结局两个情况
1.查到了target,一定是middle索引
2.没有查到target,那么最终也是找到了target的边界值。left索引就是需要插入的下一个位置。
我用的是左闭右闭方法:
class Solution {
public int searchInsert(int[] nums, int target) {
//这个就是二分法的题
int left = 0;
int right = nums.length - 1; //左闭右闭区间
int middle;
while (left <= right){
middle = (left +right) /2;
if(nums[middle] ==target){
return middle;
}
if(nums[middle] > target){
right = middle - 1;
}
else{
left = middle + 1;
}
}
return left;
}
}
我也想了下,如果使用左闭右开,left还是边界。
同样的还有力扣:34. 在排序数组中查找元素的第一个和最后一个位置(后续补上)
2.双指针方法
1.题目:力扣 27. 移除元素
思想:双指针,一快一慢,快的遍历数据,慢的就是记录数据。
class Solution {
public int removeElement(int[] nums, int val) {
//原地修改就是用覆盖的方法,双指针来操作
int left = 0;
int right;
for(right = 0; right < nums.length ; right ++){
if(nums[right] != val){
nums[left] = nums[right];
left++;
}
}
return left;
}
}