两数之和

不积硅步无以至千里

leetcode题库第一题——两数之和
给定一个整数数组和一个整数目标值,返回两个数的下标,这两个数相加和为目标值。
条件1:假定给定的数组中最多有一组数据满足条件。
条件2: 数组中的元素每个只能使用一次。
条件3: 可以以任意顺序返回两个元素的下标。

暂时有两种解决办法:
一、省时间
解决思路: 先从头到尾遍历数组,取到第一个元素之后遍历第一个元素之后的元素,然后判断两数之和是否为target,如果找到了,就保存这两个数的下标,返回结果,如果没有找到,就继续查找下一个元素,再进行判断,如果都遍历完了还没有找到和为target的值,就返回{-1,-1}。
时间复杂度 o(n²),空间复杂度o(n),

/**
     * @param target   目标和
     * @param orgArray 找查找的数组
     * @return 符合条件的下标
     */

    public int[] searchNum(int target, int[] orgArray) {
        int[] result = {-1, -1};
        for (int i = 0; i < orgArray.length; i++) {
            for (int j = i + 1; j < orgArray.length; j++) {
                if (orgArray[i] + orgArray[j] == target) {
                    result[0] = i;
                    result[1] = j;
                    return result;
                }
            }
        }
        return result;
    }

二、省空间
解决思路:用一个hashMap来存储整数数组的元素和对应的下标(key存储元素,value存储元素对应的下标),然后遍历数组,判断map中是否存在target - orgArray[i]这样的key,如果存在,就返回map中对应key 的value(对应元素的下标)和i。
如果我自己写,可能会遍历两次,第一次遍历构造map,第二次遍历判断。官方解法中把两次判断和在一起同样可以实现,节省了代码的行数。在以后要写两次遍历的时候,可以考虑一下是不是可以用一次遍历实现。
如果想要节省数组查找的时间,可以考虑用HashMap来实现。
时间复杂度:o(n)
空间复杂度:o(n)

/**
     * 通过hash表来实现
     *
     * @param target
     * @param orgArray
     * @return
     */
    public int[] searchNum2(int target, int[] orgArray) {

        HashMap hashmap = new HashMap<Integer, Integer>();
        for (int i = 0; i < orgArray.length; i++) {
            if (hashmap.containsKey(target - orgArray[i])) {
                return new int[]{(int) hashmap.get(target-orgArray[i]), i};
            }
            hashmap.put(orgArray[i], i);
        }
        return new int[0];
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容