1 两数相加
public static int[] twoSum(int[] nums, int target) {
167 两数之和II输入有序数组
public int[] twoSum(int[] numbers, int target) {
注意两道题的区别
两道题都可以用哈希表进行计算 耗时3ms
但是167 是排好序的 可以用更快的方法
Map<K,V>
containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。 |
get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null 。 |
put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。 |
1
- 建立哈希表map
- 从0开始遍历数组
- 建立bu等于target-numbers[i]
- 如果bu 在map里 (map.containsKey(bu))
- 返回一个新的int数组() 用bu的索引和第i个的索引 {map.get(bu)+1,i}
- 如果不在map里 就把第i个放进map里 放入 值与对应的索引i map.put(numbers[i],i)
public int[] twoSum2(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);
}
throw new IllegalArgumentException("No two sum solution");
}
167
- // 初始时两个指针分别指向第一个元素位置和最后一个元素的位置。
- // 每次计算两个指针指向的两个元素之和,并和目标值比较。
- // 如果两个元素之和等于目标值,则发现了唯一解。
- // 数组索引从0开始
- // 如果两个元素之和大于目标值,则将右侧指针左移一位。
- // 如果两个元素之和小于目标值,则将左侧指针右移一位。
public int[] twoSum(int[] numbers, int target) {
int slow = 0, fast = numbers.length - 1;
while (slow < fast) {
int sum = numbers[slow] + numbers[fast];
if (sum == target) {
return new int[]{slow + 1, fast + 1};
} else if (sum < target) ++slow;
else --fast;
}
return new int[]{-1, -1};
}