二分查找(普通版)
/**
* 题目描述——二分查找(普通版)
*
* 给定一个排序的整数数组(升序)和一个要查找的整数target,
* 用O(logn)的时间查找到target第一次出现的下标(从0开始),
* 如果target不存在于数组中,返回 -1。
*
*/
public class Solution {
public static void main(String[] args) {
int[] array = {1, 2, 3, 3, 4, 5, 10};
int x = 3;
System.out.print("数组array中的元素:");
for(int a: array) {
System.out.print(" " + a);
}
System.out.println();
System.out.println(x + "在数组array中的位置:" + Solution.binarySearch(array, x));
}
/**
* 二分查找算法——普通版
*
* @param nums:待查找数组
* @param target:待查找元素
* @return
*/
public static int binarySearch(int[] nums, int target) {
int low = 0;
int high = nums.length -1;
while(low <= high) {
int mid = (low + high) / 2;
if(nums[mid] > target) high = mid - 1;
else if(nums[mid] < target) low = mid + 1;
else return mid;
}
return -1;
}
}
二分查找(优化版)
/**
* 题目描述——二分查找(优化版)
*
* 给定一个排序的整数数组(升序)和一个要查找的整数target,
* 用O(logn)的时间查找到target第一次出现的下标(从0开始),
* 如果target不存在于数组中,返回 -1。
*
*/
public class Solution {
public static void main(String[] args) {
int[] array = {1, 2, 3, 3, 4, 5, 10};
int x = 3;
System.out.print("数组array中的元素:");
for(int a: array) {
System.out.print(" " + a);
}
System.out.println();
System.out.println(x + "在数组array中的位置:" + Solution.binarySearch(array, x));
}
/**
* 二分查找算法——优化版
*
* @param nums:待查找数组
* @param target:待查找元素
* @return
*/
public static int binarySearch(int[] nums, int target) {
if (nums == null || nums.length == 0 ||
target < nums[0] || target > nums[nums.length - 1])
return -1;
int left = 0;
int right = nums.length - 1;
while (left < right - 1) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) left = mid + 1;
else if (nums[mid] > target) right = mid - 1;
else right = mid;
}
if (nums[left] == target) return left;
else if (nums[right] == target) return right;
else return -1;
}
}
把排序数组转换为高度最小的二叉搜索树
class TreeNode {
public int val;
public TreeNode left, right;
public TreeNode(int val) {
this.val = val;
this.left = this.right = null;
}
}
/**
* 题目描述——把排序数组转换为高度最小的二叉搜索树
*
* 给一个排序数组(从小到大),将其转换为一棵高度最小的排序二叉树。
*
*/
public class Solution {
/**
* 把排序数组转换为高度最小的二叉搜索树——二分查找算法思想应用
*
* @param A:待转换数组
* @return
*/
public TreeNode sortedArrayToBST(int[] A) {
if(A == null || A.length == 0) return null;
TreeNode root = sortedArrayToBST(A, 0, A.length - 1);
return root;
}
/**
* 把排序数组转换为高度最小的二叉搜索树——二分查找算法思想应用
*
* @param A:待转换数组
* @param start:二分查找起点
* @param end:二分查找终点
* @return
*/
public TreeNode sortedArrayToBST(int[] A, int start, int end){
if(start > end) return null;
int mid = start + (end - start) / 2;
TreeNode root = new TreeNode(A[mid]);
TreeNode left = sortedArrayToBST(A, start, mid - 1);
TreeNode right = sortedArrayToBST(A, mid + 1, end);
root.left = left;
root.right = right;
return root;
}
}