两数之和——1

两数之和

题目:两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 :

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

题解

方法一:哈希表

当前元素查找哈希表,看是否在哈希表中有值,相加等于target。有则返回下标,没有则将当前元素添加到哈希表中。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(target - nums[i])) {
                return new int[]{map.get(target - nums[i]), i};
            }
            map.put(nums[i], i);
        }
        return new int[0];
    }
}

方法二:双指针

定义类,成员为数值和下标,对类的数组以数值从小达到排序,对排序的结果做双指针。

class Solution2 {
    //可排序类
    class Num implements Comparable<Num> {
        int number, index;

        public Num(int number, int index) {
            this.number = number;
            this.index = index;
        }

        @Override
        public int compareTo(Num o) {
            return this.number - o.number;
        }
    }

    public int[] twoSum(int[] nums, int target) {
        Num[] myNums = new Num[nums.length];
        for (int i = 0; i < nums.length; i++) {
            myNums[i] = new Num(nums[i], i);
        }
        Arrays.sort(myNums);
        
        //双指针
        int left = 0, right = myNums.length - 1, sum;
        while (left < right) {
            sum = myNums[left].number + myNums[right].number;
            if (sum == target) {
                return new int[]{myNums[left].index, myNums[right].index};
            } else if (sum > target) {
                right--;
            } else {
                left++;
            }
        }
        return new int[0];
    }
}
posted @ 2022-02-06 10:53  言思宁  阅读(49)  评论(0编辑  收藏  举报