两数之和

来源:互联网 发布:网络安全技术保障方案 编辑:程序博客网 时间:2024/06/08 02:16

给一个整数数组,找到两个数使得他们的和等于一个给定的数 target

你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 1 到 n,不是以 0 开头。


package com.eyric.basic;import org.junit.Test;import java.util.*;/** * 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。 * 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 1 到 n,不是以 0 开头。 * 样例:给出 numbers = [2, 7, 11, 15], target = 9, 返回 [1, 2]. */public class T1_sum_array {    //解法一    public int[] twosum(Integer[] numbers, int target) {        int[] res = new int[2];        for (int i = 0; i < numbers.length; i++) {            int v = numbers[i];            for (int j = i; j < numbers.length; j++) {                if (numbers[j] == target - v) {                    if (i == j) {                        continue;                    }                    res[0] = i + 1;                    res[1] = j + 1;                    return res;                }            }        }        return res;    }    //解法二    public int[] twosum2(Integer[] numbers, int target) {        int[] res = new int[2];        if (target == 0) {            int j = 0;            for (int i = 0; i < numbers.length; i++) {                if (numbers[i] == 0) {                    res[j++] = i + 1;                    if (j == 2) {                        return res;                    }                }            }        }        Map<Integer, Integer> map = new HashMap<>();        for (int i = numbers.length - 1; i >= 0; i--) {            map.put(numbers[i], i);            if (map.containsKey(target - numbers[i])) {                res[0] = i + 1;                res[1] = map.get(target - numbers[i]) + 1;                if (res[0] == res[1]) {                    continue;                }                return res;            }        }        return null;    }    @Test    public void test() {        Integer[] nums = {0, 4, 3, 0};        int target = 0;        int[] res = twosum2(nums, target);    }}