【题目描述】
AcWing 75. 和为S的两个数字
【思路】
1、对数组进行升序排序
2、枚举数组的每一个数nums[i],查找与之能构成和为target的数target - nums[i]在不在数组中。
class Solution {
public int binary_search(int nums[], int target){
int l = 0, r = nums.length - 1;
while(l < r){
int mid = l + r >> 1;
if(target > nums[mid]) l = mid + 1;
else r = mid;
}
if( nums[l] != target )return - 1;
return l;
}
public int[] findNumbersWithSum(int[] nums, int target) {
Arrays.sort(nums);
int n = nums.length;
for(int i = 0; i < n; i ++)
{
int v = target - nums[i];
int k = binary_search(nums, v);
if( k != -1 ) {
return new int[]{nums[i], nums[k] };
}
}
return new int[]{};
}
}
哈希表O(n)做法
【思路】
1、枚举数组的每一个数nums[i],如果map.contains(target - nums[i] )为false,说明其另一半还未出现,先把自己put进去。方便另一半查找到自己。
2、如果map.contains(target - num[i])为true,说明另一半出现了。
class Solution {
public int[] findNumbersWithSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++)
{
if( !map.containsKey(target - nums[i]) ) map.put(nums[i], i);
else return new int[]{nums[i], target - nums[i]};
}
return new int[]{};
}
}