1. 两数之和

题目描述

思路

分两种:排序之后从两边向中间遍历;哈希表

排序

为了能够排完序之后保留下标信息,需要新定义一个类。在类中保留数字和对应下标,并实现Compareble接口,重写compareTo方法,注意在compareTo方法中只对数字进行比较,而下标不参与比较。我把这个类定义为Data。

定义完这个类之后,由所给数组(nums)新建一个Data数组。然后调用Arrays.sort()对Data数组进行排序。从数组的两端(头指针pre,尾指针post)向中间逼近,寻找加和等于target的两个数。

在寻找的过程中,若pre和post指向的两个数相加小于target,则pre加1;若大于target,则post-1;若等于target,退出循环并返回结果。

java代码如下:

import java.util.Arrays;

class Solution {
    public class Data implements Comparable {
        int index;
        int data;

        Data(int index, int data) {
            this.data = data;
            this.index = index;
        }

        @Override
        public int compareTo(Object o) {
            if (o instanceof Data) {
                Data s = (Data) o;
                if (this.data > s.data)
                    return 1;
                else if (this.data == s.data)
                    return 0;
                else
                    return -1;
            }
            return 0;
        }
    }

    public int[] twoSum(int[] nums, int target) {
        int length = nums.length;
        int pre = 0;
        int post = length - 1;
        int sum = 0;

        Data[] datas = new Data[length];
        for (int i = 0; i < length; i++)
            datas[i] = new Data(i, nums[i]);

        Arrays.sort(datas);

        while (true) {
            sum = datas[pre].data + datas[post].data;
            if (sum == target) {
                break;
            } else if (sum < target) {
                pre = pre + 1;
            } else {
                post = post - 1;
            }
        }

        int[] res = { datas[pre].index, datas[post].index };
        return res;
    }
}

执行用时:6 ms, 在所有 Java 提交中击败了36.96%的用户
内存消耗:38.7 MB, 在所有 Java 提交中击败了32.34%的用户

36%,结果不太好,下一个方法。

哈希表

以数组下标为key,对应位置上的元素为value,创建hashMap,命名为map。

对所给数组nums进行遍历。对每个元素,若与该元素加和为target的那个数是map的一个key,则找到答案,将该元素的下标与那个key对应的value返回;若不是map的一个key,将该元素的<元素值,下标>添加到map中(即使该元素已存在与map中也无所谓,因为题设已说明答案必定唯一)

一次遍历即可得到结果

java代码如下:

import java.util.HashMap;

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int length = nums.length;
        HashMap map = new HashMap();

        for (int i = 0; i < length; i++) {
            if (map.containsKey(target - nums[i])) {
                int[] res = { i, map.get(target - nums[i]) };
                return res;
            } else {
                map.put(nums[i], i);
            }
        }

        return null;
    }
}

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.7 MB, 在所有 Java 提交中击败了41.46%的用户

你可能感兴趣的:(1. 两数之和)