编程题3

题目描述:定义有数组int a[200] = {1,2,3,3,4,…},数组元素都为正整数,当满足a[i]+a[t]=a[x]时,其中,i、t、x均为正数,且小于等于n,求最大的a[x].

问题的主要思路如下: 首先对数组进行排序,然后从后往前遍历数组。对于每遍历的一个数组元素a[i],判断从0到a[i-1]个元素中,是否满足a[j]+a[k]=a[i]的值。在判断的时候,可以采用如下思路:从前往后遍历子数组a[0,…..,i-1],对于遍历到的元素a[j],判断在子数组a[j+1,…,i-1]中是否存在a[i]-a[j]。如果存在,则说明存在j和k,使得a[j]+a[k]=a[i],此时的a[i]就是满足条件的最大值。

代码:

import java.util.Arrays;

public class FindSuitable {

    public static void main(String[] args){
        int[] a={1,2,3,3,4,3,2,8,9,6};
        int result = findMaxValue(a);
        if (result == -1){
            System.out.println("不存在");
        }else {
            System.out.println("满足条件的最大值:"+result);
        }
    }

    private static int findMaxValue(int[] arr) {
        if (arr == null || arr.length == 0){
            return -1;
        }
        Arrays.sort(arr);

        for (int i = arr.length - 1; i >= 2; i--){
            for (int j = 0; j < i;j++){
                // 判断在arr[j...i-1]是否存在arr[i]-arr[j],如果存在存在一个k使得arr[j]+arr[k]=arr[i]
                if (isExists(arr,j,i-1,arr[i]-arr[j])){
                    return arr[i];
                }
            }
        }
        return -1;
    }

    /**
     * 用二分法判断在arr[low...high】中是否存在data
     * @param arr
     * @param low
     * @param high
     * @param data
     * @return
     */
    private static boolean isExists(int[] arr, int low, int high, int data) {
        while (low < high){
            int mid = (low + high) / 2;
            if (arr[mid] == data){
                return true;
            }else if (arr[mid] > data){
                high = mid - 1;
            }else {
                low = mid + 1;
            }
        }
        return false;
    }
}
原文地址:https://www.cnblogs.com/daleyzou/p/9135589.html