算法设计之分治法

来源:互联网 发布:超星尔雅网络登录页面 编辑:程序博客网 时间:2024/05/16 12:42
当问题满足以下条件时,可以使用分治法解决问题:

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);}}


0 0
原创粉丝点击