二分查找的例子:为下文做铺垫:
c++:
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
return lower_bound(nums.begin(),nums.end(),target)-nums.begin();
}
};
java:
class Solution {
public int searchInsert(int[] nums, int target) {
return toBST(nums,0,nums.length-1,target);
}
public int toBST(int[]nums,int left,int right,int target)
{
if(left>right)return left;
int mid=(int)(left+right)/2;
if(target==nums[mid])return mid;
if(target>nums[mid])return toBST(nums,mid+1,right,target);
if(target<nums[mid])return toBST(nums,left,mid-1,target);
return mid;
}
}
-------------------->Java递归加上二分搜索将有序数组转化为平衡二叉树
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return ToBST(nums,0,nums.length-1);
}
public static TreeNode ToBST(int nums[],int left,int right){
if(left>right)return null;//定义的二分区间为[left,right],无法进行继续递归,直接退出
int mid = (int)(left+right)/2;//二分中值
TreeNode root = new TreeNode(nums[mid]);
root.left = ToBST(nums,left,mid-1);//注意mid-1 对左半部分进行递归
root.right = ToBST(nums,mid+1,right);//注意mid+1 对右半部分进行递归
return root;
}
}