题解 | #动物牛的最小和#
动物牛的最小和
https://www.nowcoder.com/practice/8aa4227c02aa4d989f31f2beea4f3536?tpId=363&tqId=10615055&ru=/exam/oj&qru=/ta/super-company23Year/question-ranking&sourceUrl=%2Fexam%2Foj
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了

