import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @param k int整型 * @return int整型 */ /** 方法一:哈希表+数学模拟 */ public int findMinSum(int[] nums, int k) { HashSet<Integer> hashSet = new HashSet<>(); int maxNumber = Integer.MIN_VALUE; for (int i = 0; i < nums.length; i++) { hashSet.add(nums[i]); maxNumber = Math.max(nums[i], maxNumber); } if (2 * maxNumber <= k) { return -1; } int minSum = Integer.MAX_VALUE; Iterator<Integer> iterator = hashSet.iterator(); while (iterator.hasNext()) { Integer number = iterator.next(); int index = 0; while (true) { Integer needNumber = k - number + 1 + index; if (hashSet.contains(needNumber)) { minSum = Math.min(needNumber + number, minSum); break; } if (needNumber > maxNumber) { break; } index++; } } return minSum; } /** 方法二:二分查找 */ public int findMinSum(int[] nums, int k) { Arrays.sort(nums); // 将数组排序 int left = 0; int right = nums.length - 1; int minSum = Integer.MAX_VALUE; while (left < right) { int sum = nums[left] + nums[right]; if (sum < k) { left++; } else if (sum > k) { right--; } else { // 找到了和为k的两个数 minSum = Math.min(minSum, nums[left] + nums[right]); left++; right--; } } return minSum == Integer.MAX_VALUE ? -1 : minSum; } }
本题知识点分析:
1.哈希表
2.二分查找
3.数学模拟
4.API函数Math.min和Math.max
本题解题思路分析:
1.方法一是我一开始想的,方法二的二分查找忘了,本来一开始是想排序,但是后来忘记二分查找的解法,时间复杂度还是O(n2),方法一稍微剪枝了下
2.方法一是,先遍历获取所有值,然后算出最大值
3.然后遍历哈希表,判断是否有needNumber这个数并且要小于等于最大数,needNumber就是可以满足题目中两数之和的最小和的第二个数,k-number+1,例如 60-1+1 = 60 1+60=61 满足最小和
4.方法二轻松搞定,先快速排序,然后二分查找,第一次没想到,面试就G了