题目描述:定义有数组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; } }