leetcode刷题(java)-01-给定⼀个数组和⼀个⽬标和,从数组中找两个数字相加等于⽬标和,输出这两个数字的下标

Posted Ocean:)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode刷题(java)-01-给定⼀个数组和⼀个⽬标和,从数组中找两个数字相加等于⽬标和,输出这两个数字的下标相关的知识,希望对你有一定的参考价值。

题目描述

给定⼀个数组和⼀个⽬标和,从数组中找两个数字相加等于⽬标和,输出这两个数字的下标

第一种方法

使用两层循环进行判断,条件成立返回结果

    /**
     * 方法一:两层循环,比较
     * @param arrays 要比较的数组
     * @param target 比较的目标
     * @return
     */
    public static int[] twoSum1(int[] arrays, int target) {
        int[] res = new int[2];
        for (int i=0; i < arrays.length; i++) {
            for (int j=(i + 1); j < arrays.length; j++) {
                if (arrays[i] + arrays[j] == target) {
                    res[0] = i;
                    res[1] = j;
                    return res;
                }
            }
        }
        return res;
    }

时间复杂度:两层for循环,O(n^2)

空间复杂度:O(1)

第二种方法

使用hash table,可以把数组的每个元素保存为 hash 的 key,下标保存为 hash 的 value

    public  static int[] twoSum2(int[] arrays, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < arrays.length; i ++) {
            // key 为数值,value为下标
            map.put(arrays[i], i);
        }
        for (int i = 0; i < arrays.length; i ++) {
            int sub = target - arrays[i];
            if (map.containsKey(sub) && map.get(sub) != i) {
                return new int[]{i, map.get(sub)};
            }
        }
        throw new IllegalArgumentException("No two sum solution");
    }

时间复杂度:一层循环 O(1)

空间复杂度:所谓的空间换时间,这⾥就能体现出来, 开辟了⼀个 hash table ,空间复杂度变为 O(n)

第三种方法

将方法二中的两个for循环合在一起,

    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            int sub=target-nums[i];
            if(map.containsKey(sub)){
                return new int[]{i,map.get(sub)};
            }
            map.put(nums[i], i);
        }
        throw new IllegalArgumentException("No two sum solution");
    }
  throw new IllegalArgumentException("No two sum solution");
}

以上是关于leetcode刷题(java)-01-给定⼀个数组和⼀个⽬标和,从数组中找两个数字相加等于⽬标和,输出这两个数字的下标的主要内容,如果未能解决你的问题,请参考以下文章

leetcode刷题39.最小操作次数使数组元素相等——Java版

LeetCode Java刷题笔记—349. 两个数组的交集

LeetCode Java刷题笔记—349. 两个数组的交集

leetcode刷题1:两数之和two_sum

leetcode刷题65.判断子序列 ——Java版

leetcode刷题29.合并二叉树——Java版