力扣 1877. 数组中最大数对和的最小值

题目来源:https://leetcode-cn.com/problems/minimize-maximum-pair-sum-in-array/

大致题意:
给一个数组,将数组元素两两成对,求出可能有的最小的最大数对和。也就是,想办法让数对和的最大值最小。

思路

感觉就像求方差,数对和每个元素,平均值肯定是固定的(总和 除 总数量),但是元素之间差别太大,方差也就会大。就像是元素中,有元素特别大,也特别小。
我们要做的就是避免出现这种情况,尽量让方差比较小,也就是让数对和尽量差别不大,这样做最大的数对和也就会相对较小
那么,若想让达到相对较小的最大的数对和,需要将大的数加上小的数

排序+双遍历

若要将大的数加上小的数,需要找到大的数小的数
于是可以先将原数组升序排序,那么大的数就在末尾的位置,小的数就在靠前的位置。
那么就有如下方法:

  1. 先排序
  2. 使用双指针,一个从头开始遍历,一个从末尾开始遍历,当头指针大于尾指针时结束。
  3. 将当前双指针对应元素相加,然后存下该数对和最大数对和之间的最大值。

最终得到的就是相对较小的最大的数对和

代码:

public int minPairSum(int[] nums) {
        int maxSum = 0;
        Arrays.sort(nums); // 排序
		// 双指针开始遍历
        for (int i = 0, j = nums.length - 1; i < j; i++, j--) { 
            int sum = nums[i] + nums[j];
            maxSum = Math.max(sum, maxSum); // 求最大值
        }
        return maxSum;
    }

时间复杂度O(nlogn),空间复杂度O(logn)

你可能感兴趣的:(贪心,leetcode,java)