当问题满足以下条件时,可以使用分治法解决问题:
1.问题可以分解为规模更小、问题类似的子问题;
2.可以直接得到子问题的解;
3.合并子问题的解可以得到原问题的解。
为了熟悉分治法的使用,编码解决以下问题:
一、分治法求最大最小值:
package algrithom;
import java.util.Arrays;
public class maxmin {
public static void main(String[] args) {
int arr[] = { -2, -9, 0, 5, 2 };
int result[] = new int[2];
result = minMax(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(result));
}
public static int[] minMax(int[] arr, int l, int r) {
int min = 0;
int max = 0;
if (l == r) {
min = arr[l];
max = arr[l];
} else if (l + 1 == r) {
if (arr[l] < arr[r]) {
min = arr[l];
max = arr[r];
} else {
min = arr[r];
max = arr[l];
}
} else {
int mid = (l + r) / 2;
int[] preHalf = minMax(arr, l, mid);
int[] postHalf = minMax(arr, mid + 1, r);
min = preHalf[0] < postHalf[0] ? preHalf[0] : postHalf[0];
max = preHalf[1] > postHalf[1] ? preHalf[1] : postHalf[1];
}
return new int[] { min, max };
}
}
时间复杂度为T(n)=3n/2-2。
二、分治法之二分搜索
package algrithom;
public class Findkeywords {
/**
* 二分查找
* @param array
* @param left
* @param right
* @param key
* @return
*/
public static int find(int[] array,int left,int right,int key){
//int n=array.length;
int mid;
if(left<=right){
mid=(right+left)/2;
if(key==array[mid]) return mid;
else if(key<array[mid])
return find(array, left, mid, key);
else if(key>array[mid])
return find(array, mid, right, key);
}
return -1;
}
public static void maxmin(){
}
public static void main(String args[]){
int[] array={1,2,3,4,5,6,7,8,9};
int key=9;
Findkeywords fk=new Findkeywords();
int result=find(array, 1, 9, key);
System.out.print(result);
}
}