两数之和-leetcode

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
两个思路:
1、无脑双循环:直接循环每个数值对比一遍。类似于冒泡。
时间复杂度O(n²),空间复杂度O(1)
2、使用hashmap保存每个值与目标值的差值,这样循环时根据map中是否有与当前值相同的值,即可得到两数。
时间复杂度O(n),空间复杂度O(n)

第一种代码实现:

public int[] twoSum(int[] nums, int target) {
        int[] result = new int[2];
        boolean flag = false;
        for (int i = 0; i < nums.length - 1; i++) {
            for (int j = i+1; j < nums.length; j++) {
                if ((nums[i] + nums[j]) == target) {
                    result[0] = i;
                    result[1] = j;
                    flag = true;
                    break;
                }
            }
            if (flag) {
                break;
            }
        }
        return result;
    }

leetcode的执行时间:55ms

第二种代码实现:

public int[] twoSum(int[] nums, int target) {
        int[] result = new int[2];

        //余数map,key是每个数字与target相差的数值,value是这个数字的下标+1,因为题目要求的下标是从1开始的
        Map<Integer, Integer> remainder = new HashMap<>(16);

        for (int i = 0; i < nums.length; i++) {
            //如果key有匹配的值,证明找到
            if (remainder.containsKey(nums[i])) {
                result[0] = i;
                result[1] = remainder.get(nums[i]);
                return result;
            }
            //不存在,将这个值存入余数map中
            remainder.put(target - nums[i], i);
        }
        return null;
    }

leetcode执行时间:8ms

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不...
    0Xday阅读 195评论 0 0
  • 算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...
    第六象限阅读 3,272评论 0 0
  • 题目:两数之和 描述: 示例: 方法一:循环嵌套,时间复杂度O(n2),空间复杂度O(1) 代码如下: 执行时间:...
    韦弦Zhy阅读 1,503评论 4 2
  • <center>#1 Two Sum</center> link Description:Given an arr...
    铛铛铛clark阅读 2,213评论 0 3
  • 谦虚,何为谦虚? 谦为上,虚为下,旁人莫知尔傲骨,却知尔圆润,此乃谦虚之道也! 生者圆润而谦虚,死者枯槁而坚强,此...
    桐熹阅读 388评论 1 2