两数之和

两数之和

http://www.nowcoder.com/questionTerminal/20ef0972485e41019e39543e8e895b7f

写个题解。
原思路:

  1. 首先想到能不能排序。若是有序数组,将会节省不小的时间开销(target/2往后的不用看;每轮一旦两数和大于 target 即可 break)。
  2. 再看题目要求输出 index,若先排序 index 就乱了,貌似没戏。
  3. 还不死心,想能不能通过 Map 来存取改动前的 index。
  4. 取一种折中的办法,数组不用完全有序,只要设立一个 target/2 基准点即可(类似快排),因为两数不可能同时出现在 target/2 的同一侧!(貌似能成)
  5. map存取所有移动过元素的原索引,以及所有左侧元素索引,这样只需遍历右侧的元素,看target与元素之差存在 map 中的值(索引)即可。
  6. 照着这个思路写完了,部分用例未通过(如[0,2,3,0],0,也就是 target 恰好等于最小值的情况)
  7. 抓耳挠腮过程中偷瞄了一眼 LeetCode 上的题解,泪流满面。相比之下我这都什么废物思路。直接给跪了,怒删代码。
    图片说明

LeetCode 题解思路:遍历,每次判断 target - current 是否在 Map 中,若在直接返回;若不在将 current 和对应索引存入 Map。
注意:因为每次找的是 target 和当前元素的差值,因此理论上不存在元素覆盖的问题(因为题目声明只有唯一解)。

下面贴个代码,真·信达雅。

public int[] twoSum (int[] numbers, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int cur = 0, tmp; cur < numbers.length; cur++){
        tmp = numbers[cur];
        if (map.containsKey(target - tmp)){
            return new int[] {map.get(target - tmp) + 1, cur + 1};
        }
        map.put(tmp, cur);
    }
    throw new RuntimeException("results not exits");
}
全部评论
为什么都不考虑负整数的可能性呢?
1 回复 分享
发布于 2021-05-28 14:26
我跟你思路差不多,但是想到既然后用map存原来的index了 干啥不直接用来找差值(就是你下面的解题)。 但是又在想是不是有啥o(1)的空间的解题方法
1 回复 分享
发布于 2021-03-29 16:57
emmm我想说个不重要的地方的错误,results not exists,“存在”的英文写错了,嘿嘿
2 回复 分享
发布于 2021-08-11 11:11
一毛一样。。看到target - concurrent就懂了。。
点赞 回复 分享
发布于 2022-11-09 23:00 广东
哈哈哈同款思路,同款求不出来
点赞 回复 分享
发布于 2022-09-11 16:11 湖北
哈哈我的思路和你一毛一样,第一反应也是排序,然后被index难住了,看了一眼解法,我是傻○
点赞 回复 分享
发布于 2021-09-21 22:10
public static int[] twoSum (int[] numbers, int target) { int index1 = 0; int index2 = 0; int[] ints = new int[2]; for (int i = 0; i < numbers.length; i++) { int num = target - numbers[i]; for (int j = 0; j < numbers.length; j++) { if (num == numbers[j]){ index1 = i + 1; index2 = j + 1; break; } } } if (index1>index2) { ints[0] = index2; ints[1] = index1; }else { ints[0] = index1; ints[1] = index2; } return ints; } 求大佬告知,为啥这样写能通过测试,但提交通过不了
点赞 回复 分享
发布于 2021-07-26 17:27
点赞心路历程!
点赞 回复 分享
发布于 2021-07-21 15:34
map对象的key值不可以重复,如果key值重复,再使用这种方法的话,代码就不会通过,怎么办?
点赞 回复 分享
发布于 2021-05-16 23:37
target - current,每次遍历是否在map中,还能这样用,666,考察map对象使用
点赞 回复 分享
发布于 2021-03-30 15:29
提一嘴,排序的话,你只需要知道那两个数是什么,最后for一遍原数组找到那两个对应的就可以了
点赞 回复 分享
发布于 2021-03-10 11:10

相关推荐

群星之怒:1.照片可以换更好一点的,可以适量P图,带一些发型,遮住额头,最好穿的正式一点,可以适当P图。2.内容太少。建议添加的:求职意向(随着投递岗位动态更改);项目经历(内容太少了建议添加一些说明,技术栈:用到了什么技术,还有你是怎么实现的,比如如何确保数据传输稳定的,角色注册用到了什么技术等等。)项目经历是大头,没有实习是硬伤,如果项目经理不突出的话基本很难过简历筛。3.有些内容不必要,比如自我评价,校内实践。如果实践和工作无关千万别写,不如多丰富丰富项目。4.排版建议:建议排版是先基础信息,然后教育背景(要突出和工作相关的课程),然后专业技能(一定要简短,不要长篇大论,写你会什么,会的程度就可以),然后是项目经历(一定要详细,占整个简历一定要超过一半,甚至超过百分之70都可以)。最后如果有一部分空白的话可以填补上校内获得的专业相关的奖项,没有就写点校园经历和自我评价。5.技术一定要够硬,禁得住拷打。还有作息尽量保证正常,不要太焦虑。我24双非本科还是非科班,秋招春招各找了一段实习结果都没有转正,当时都想噶了,最后6月份在校的尾巴也找到一份工作干到现在,找工作有时很看运气的不要急着自我否定。 加油
点赞 评论 收藏
分享
评论
68
8
分享

创作者周榜

更多
牛客网
牛客企业服务