lccc总结
二分总结
二分总结,以35为例,升序数组,无重复元素,给定target,如果存在,则找出下标,否则找到需要插入的索引。
统一用左开右闭。
法1:< = > 三种情况考虑,循环结束的时候,left==right,但是需要额外考虑,结束的时候,left处的元素,是否>=target。
public int searchInsert(int[] nums, int target) {
int n = nums.length;
if(target>nums[n-1]) return n;
if(target<nums[0]) return 0;
int left = 0;
int right = n-1;
while(left<right){
int mid = (right+left)/2;
if(nums[mid]==target) return mid;
else if(nums[mid]>target){
right = mid-1;
}else if(nums[mid]<target){
left = mid+1;
}
}
return nums[left] >= target?left:left+1;
}
法2、3 用排除法
第一种写法是找出第一个>=target的索引,第二种写法是找出最后一个<=target的索引,如何区分呢,看排除法那个区间是怎么变的
public int searchInsert(int[] nums, int target) {
int n = nums.length;
if(target>nums[n-1]) return n;
if(target<nums[0]) return 0;
int left = 0;
int right = n-1;
while(left<right){
int mid = (right+left)/2;
if(nums[mid]<target){
left = mid + 1;
}else{
right = mid;
}
}
return left;
}
public int searchInsert(int[] nums, int target) {
int n = nums.length;
if(target>nums[n-1]) return n;
if(target<nums[0]) return 0;
int left = 0;
int right = n-1;
while(left<right){
int mid = (right+left+1)/2;
if(nums[mid]>target){
right = mid - 1;
}else{
left = mid;
}
}
return nums[left] == target?left:left+1;
}