1. 题目
题目的关键点在于:最大数对和的值 最小!
那么怎么才能最小呢,最后组成的数对,每对数对的值尽可能平均
就有了一个思路:(1)数组排序 (2)最小值与最大值相加
(1)Arrays.sort()
class Solution {
public int minPairSum(int[] nums) {
//题目的关键点在于:最大数对和的值 最小!
//那么怎么才能最小呢,最后组成的数对,每对数对的值尽可能平均
//就有了一个思路:(1)数组排序 (2)最小值与最大值相加
Arrays.sort(nums);
int left = 0, right = nums.length - 1;
int max = 0;
while(left < right){
max = Math.max(max, nums[left] + nums[right]);
left++;
right--;
}
return max;
}
}
(2)手动快排
class Solution {
public int minPairSum(int[] nums) {
//题目的关键点在于:最大数对和的值 最小!
//那么怎么才能最小呢,最后组成的数对,每对数对的值尽可能平均
//就有了一个思路:(1)数组排序 (2)最小值与最大值相加
int left = 0, right = nums.length - 1;
quickSort(nums, left, right);
int max = 0;
while(left < right){
max = Math.max(max, nums[left] + nums[right]);
left++;
right--;
}
return max;
}
public void quickSort(int[] nums, int left, int right) {
if (left >= right)
return;
//取最左边节点为哨兵,哨兵为left
int i = left, j = right;
while (i < j) {
while (i < j && nums[j] >= nums[left]) //从右往左,找到第一个比哨兵小的节点
j--;
while (i < j && nums[i] <= nums[left]) //从左往右,找到第一个比哨兵大的节点
i++;
swap(nums, i, j); //交换
}
swap(nums, left, i); //交换i,j相交的i节点 与 哨兵节点
//继续递归左右子序列
quickSort(nums, left, i - 1);
quickSort(nums,i + 1, right);
}
public void swap(int[] nums, int left, int right) {
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
}
}