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

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;
    }
複製代碼
相關文章
相關標籤/搜索