Java函数实现求两数之和的算法
发布时间:2023-07-26 10:33:59
求两数之和算法的思路可以有很多种,以下是几种不同的实现方式。
方法一:暴力法
最简单直观的方式就是使用两个嵌套循环,依次遍历数组中的每一个元素,判断是否存在两个数的和等于目标值。时间复杂度为O(n^2)。
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length - 1; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) {
return new int[]{i, j};
}
}
}
// 如果不存在符合条件的结果,则返回一个空数组
return new int[0];
}
方法二:哈希表
使用哈希表可以减少查找的时间复杂度,将数组中的元素与其下标存储在哈希表中,然后遍历数组,对于每个元素,计算出与目标值的差值,判断差值是否在哈希表中即可。时间复杂度为O(n)。
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[]{map.get(complement), i};
}
map.put(nums[i], i);
}
// 如果不存在符合条件的结果,则返回一个空数组
return new int[0];
}
方法三:双指针法
如果数组是有序的,可以使用双指针的方法,一个指针从数组的开始位置开始,另一个指针从数组的末尾向前移动,比较两个指针所指向的元素的和与目标值的大小关系,根据比较结果调整指针的位置。时间复杂度为O(n)。
public int[] twoSum(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum == target) {
return new int[]{left, right};
} else if (sum < target) {
left++;
} else {
right--;
}
}
// 如果不存在符合条件的结果,则返回一个空数组
return new int[0];
}
这些都是常见的求两数之和的算法实现方式,选择合适的方法取决于具体的问题要求和数据特点。
