每3日一篇leetcode,第一题:TwoSum

305 阅读1分钟

1.给一个整形数组列表,以及一个目标值,找出这个列表的两个数值,使得加起来的总和等于目标值,以下有各种用到的list,map,数组等数据结构,从中可以对比下那种数据结构的内存耗用以及查找速度更快?

    //测试数据 [3,2,4]
    //6

    //耗时43 ms	内存占用38.6 MB
    public int[] twoSum(int[] nums, int target) {
        for (int i = 0, size = nums.length; i < size; i++) {
            int left = target - nums[i];
            //1.查找left在剩余的数字中位置
            for (int j = size - 1; j > i; j--) {
                if (left == nums[j]) {
                    return new int[]{i, j};
                }
            }
        }
        return null;
    }

    //耗时112 ms	内存占用36.1 MB
    public int[] twoSum2(int[] nums, int target) {
        List<Integer> listNums = Arrays.stream(nums).boxed().collect(Collectors.toList());
        for (int i = 0, size = listNums.size(); i < size; i++) {
            int left = target - listNums.get(i);
            int index = listNums.indexOf(left);
            if (index != -1 && i != index) {
                return new int[]{i, index};
            }
        }
        return null;
    }


    //耗时2 ms	内存占用39.3 MB
    public int[] twoSum3(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)) {//map.containsKey是根据数组的下标进行索引,时间复杂度为O(n)
                return new int[]{map.get(complement), i};
            }
            map.put(nums[i], i);
        }
        return null;
    }