分治算法的思想就是分而治之,通过将原问题分解为与原问题相似的小问题,小问题再分解为规模更小的问题..最终变成一个个简单易解的问题。
二分查找就是一种简单的分治算法。
问题:
给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。
@Test
public void test(){
int[] nums = {1, 2, 3, 3, 4, 5, 10}; //含有重复的元素
int target = 3;
int left = 0;
int right = nums.length-1;
int res = -1;
while(left<=right){
int mid = (left+right)/2;
if(nums[mid] == target) res = mid;
if(nums[mid]>=target)right = mid-1;
else if(nums[mid]<target)left = mid+1;
}
System.out.println(res);
}
这里通过不断减少查找区域的范围,把大问题分解成结构相似的小问题,直到问题得解。