问题地址:https://oj.leetcode.com/problems/two-sum/
问题描述:
Given an array of integers, find two numbers such that they add up to a specific target number.
The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.
You may assume that each input would have exactly one solution.
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2
Output: index1=1, index2=2
思路:
1.因为只有唯一解,所以任意两个元素和为唯一元素。最先想到的是,穷举法,把所有2个元素相加,则得到一个值,如果是Target,则得到解。该方法可行。
判断该方法的复杂度:1+2+3+4+5+...+n= ,即 。
考虑有没有更快的方法:
2.通过Target减去数组元素,然后得到被减数,在数组中查找。通过Target减去一个元素,然后在剩余元素中取查找被减数。这样好像更方便,但是其实和上面方法1的复杂度是一样的,即 。
3.空间换时间,在方法2的基础上,如果能把在剩余元素中查找的复杂度从O(n)变为O(1),整体复杂度就会从变到O(n)。如果把查找变为O(1)呢,当然是Hash表了。因为要返回元素的小标,所以,这里用了hashMap,如果不需要下标,只需要2个元素的值,则可以用HashSet。OK,方法正确。开始实现。
几点注意事项:
1)因为需要小标,所有Map的key是元素的值,Value应该是小标,所以Map应该是 Map<int,int>。但是存在这样的问题,可能存在值相同的元素,这样的话Key相同,之前的下标会被覆盖掉。所以Value应该是一个链表或者数组,下面的code中用了Arraylist。
2)注意小标是从1开始的。
3)要求index1 must be less than index2,所以遍历的时候从0~n遍历。
4)如果是T=X+X这样情况,要避免找到相同的第一个小标,所有要跳过自己。
Code:
public int[] twoSumNotSame(int[] numbers, int target) { int[] a = new int[2]; HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>(numbers.length); for (int i = 0; i < numbers.length; i++) { if (map.get(numbers[i]) == null) { ArrayList<Integer> list = new ArrayList<Integer>(); list.add(i); map.put(numbers[i], list); } else { map.get(numbers[i]).add(i); } } ArrayList<Integer> rsList = null; int firstIndex = 0; for (int i = 0; i < numbers.length; i++) { if (map.get(target - numbers[i]) != null) { rsList = map.get(target - numbers[i]); if (rsList.size() == 1 && rsList.get(0) == i) { continue; } firstIndex = i; break; } } int secondIndex = 0; for (Integer e : rsList) { if (e != firstIndex) { secondIndex = e; break; } } a[0] = firstIndex + 1; a[1] = secondIndex + 1; return a; }UT:
@Test public void t1NotEquals() { int[] numbers = { 2, 7, 11, 15 }; int target = 9; int[] a = solution.twoSumWithSame(numbers, target); Assert.assertEquals(1, a[0]); Assert.assertEquals(2, a[1]); } @Test public void t2NotEquals2() { int[] numbers = { 20, 4, 11, 15, 3, 5, 9 }; int target = 13; int[] a = solution.twoSumWithSame(numbers, target); Assert.assertEquals(2, a[0]); Assert.assertEquals(7, a[1]); } @Test public void t3Equals() { int[] numbers = { 2, 4, 6, 7 }; int target = 8; int[] a = solution.twoSumWithSame(numbers, target); Assert.assertEquals(1, a[0]); Assert.assertEquals(3, a[1]); } @Test public void t4Equals2() { int[] numbers = { 2, 4, 6 }; int target = 12; int[] a = solution.twoSumWithSame(numbers, target); Assert.assertEquals(3, a[0]); Assert.assertEquals(3, a[1]); }思考:
空间换时间是一种常用的方法,可以通过缓存数据,或者做映射,来降低时间复杂度。
相关推荐
c c语言_leetcode 0001_two_sum
c语言入门 c语言_leetcode题解01-two-sum.c
leetcode-1-Two-Sum 这是我在 Github 的第一天。 我只是 AC leetcode 中的第一个问题。 从现在开始,我将使用Github在leetcode中记录我的生活。 我擅长 C++,但对 java 和 Python 不是很专业,我将使用最流行的 3 种...
js js_leetcode题解之1-two-sum.js
001.two-sum │ ├── information.json │ ├── README.md ├── 002.add-two-numbers │ ├── information.json │ ├── README.md ... 有一些有用的选项: Options: -r, --rule crawling rule, ...
twoSum , cases : [ { in : [ [ 2 , 7 , 11 , 15 ] , 9 ] , out : [ 0 , 1 ] } , { in : [ [ 11 , 2 , 15 , 7 ] , 9 ] , out : [ 1 , 3 ] } , ] , } npm start 特征 忽视问题 如果导出ignore: true则可以忽略问题 ...
例如,"Two Sum"问题要求在给定整数数组和一个目标值,找出数组中和为目标值的那两个整数。这个问题可以使用哈希表来解决,通过一次遍历,将元素及其索引存入哈希表,然后再次遍历,检查目标值减去当前元素是否存在...
javascript js_leetcode题解之167-two-sum-II-input-array-is-sorted.js
离线和leetcode leetcode-cli 一个享受 leetcode 的高效 cli 工具! 非常感谢 leetcode.com,一个非常棒的网站!...⦙⦙⦙⦙⦙⦙⦙⦙ ...leetcode.com。...leetcode ...leetcode ...leetcode ...leetcode ..../two-sum.cpp
离线和leetcode leetcode-cli 一个享受 leetcode 的高效 cli 工具! 非常感谢 leetcode.com,一个非常棒的网站!...⦙⦙⦙⦙⦙⦙⦙⦙ ...leetcode.com。...leetcode ...leetcode ...leetcode ...leetcode ..../two-sum.cpp
leetcode 答案 leetcode-machine-swift :SOS_button: 请帮助在Sources/leetcode-machine-swift/leetcode.swift设置所有 leetcode 问题。...1 : Question ( name : " Two Sum " , inputs : [([ 2 , 7
https://leetcode-cn.com/problems/two-sum/ 难度 : 简单 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。...
leetcode 2 leetcode-训练 算法训练。 java $: javac hello.java java ...leetcode ...leetcode ...leetcode ...leetcode ...1.two-sum.cpp leetcode test 1.two-sum.cpp leetcode test 1.two-sum.cpp -t '[1,2,3]\n3'
java入门 java_leetcode题解之001_Two_Sum
- **2.1.7 Two Sum** - 寻找数组中两个数相加等于给定目标值的索引。 - 实现思路:使用哈希表存储每个数及其索引,便于快速查找补数。 - **2.1.8 3Sum** - 在数组中找到三个数之和等于零的所有组合。 - 实现...
文档内容目录显示了一系列问题编号和对应的题目,例如“Two Sum”,“Add Two Numbers”,“Median of Two Sorted Arrays”等,这些都是典型的算法和数据结构问题。这些问题涵盖了数组操作、字符串处理、递归、动态...
1. "001_two_sum":这是LeetCode的第一道题目,名为“两数之和”。该问题要求在给定整数数组中找到两个元素,使得它们的和等于一个特定的目标值。你需要返回这两个元素的索引。这是一个基础的哈希表应用,通过遍历...
leetcode 不会1. 二和 资源: 优化搜索无序列表 你不能。 您能做的最好的事情是分解搜索任务并使用并发或并行来加速搜索任务。 从最后一个索引遍历数组 范围运算符只能以增量方式工作。 // In Kotlin/Swift // this ...
leetcode 只专注于解决方案! leetcode-helper是一个单 jar 库,它使您无需为每个问题设置解决方案测试脚手架。 生成解决方案/测试框架,编译,通过一行命令进行测试。 集成了Junit ...two_sum/ │ └──
python python_leetcode题解之170_Two_Sum_III-Data_structure_design.py