Two Sum (LeetCode)

问题描述

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

翻译

思路

解法1:双循环,简单暴力

时间复杂度:O(n^2) 空间复杂度:O(1)
两层循环,遍历两次数组,相加合为target的值的下标就是所需求值
<pre>
'' /**
'' * 时间复杂度为O(n^2),空间复杂度为O(1)
'' * 解题思路:
'' * 嵌套两个循环遍历就是了,感觉好low啊,不过竟然可以通过
'' * @param nums
'' * 数组
'' * @param target
'' * 和值
'' * @return
'' * 数值对应的下标
'' */
'' public int[] twoSum(int[] nums, int target) {
'' int k = 0;
'' int y = 0;
'' for(int i = 0; i < nums.length; i++) {
'' for(int j = i + 1; j < nums.length; j++) {
'' if(nums[i] + nums[j] == target) {
'' k = i;
'' y = j;
'' break;
'' }
'' }
'' }
'' int[] a = {k + 1, y + 1};
'' return a;
'' }
</pre>

解法2:hashMap

时间复杂度:O(n) 空间复杂度:O(n)
将数组转化为hashMap,key为数值,value为数值对应的下标。
<pre>
'' /**
'' * 时间复杂度O(n)
'' * 解题思路:
'' * 将数组转化为hashMap,key为数值,value为数值下标
'' * 遍历数组:
'' * 若Map中不包含当前数值,则将key:target - num;value=i添加到Map,target - value表示与之对应的数值,i表示数组下标
'' * 若Map中包含当前数值,说明之前有一个数num1,与当前的数值num2是对应的,取出Map中num1记录的下标值及当前的i就是所需的下标值
'' * @param nums
'' * 数组
'' * @param target
'' * 和值
'' * @return
'' * 数值对应的下标
'' */
'' public int[] twoSum_type2(int[] nums, int target) {
'' int[] a = new int[2];
'' Map<Integer, Integer> numsMap = new HashMap<Integer, Integer>();
'' for(int i = 0; i < nums.length; i++) {
'' if(numsMap.containsKey(nums[i])) {
'' a[0] = numsMap.get(nums[i]) + 1;
'' a[1] = i + 1;
'' } else {
'' numsMap.put(target - nums[i], i);
'' }
'' }
'' return a;
'' }
</pre>

解法3:双指针夹逼

时间复杂度:O(nlog^n) 空间复杂度:O(n)
排序的时间复杂度为O(logn),双指针夹逼的时间复杂度为O(n),先排序再用双指针夹逼,因此时间复杂度为O(nlongn)
<pre>
'' /**
'' * 时间复杂度O(n*log^n)
'' * 解题思路:
'' *
'' * @param nums
'' * 数组
'' * @param target
'' * 和值
'' * @return
'' * 数值对应的下标
'' */
'' public int[] twoSum_type3(int[] nums, int target) {
'' int[] a = new int[2];
''
'' int head = 0;
'' int tail = nums.length - 1;
'' //记录数值对应的下标
'' double[] numsCopy = new double[nums.length];
'' for(int i = 0; i < nums.length; i++) {
'' numsCopy[i] = nums[i] + 0.01 * i;
'' }
'' //排序
'' Arrays.sort(numsCopy);
'' //遍历数组,双指针夹逼
'' while (head < tail) {
'' if(Math.floor(numsCopy[head]) + Math.floor(numsCopy[tail]) < target) {
'' head++;
'' } else if(Math.floor(numsCopy[head]) + Math.floor(numsCopy[tail]) > target) {
'' tail--;
'' } else {
'' a[0] = (int)(Math.ceil((numsCopy[head] - Math.floor(numsCopy[head])) * 100)) + 1;
'' a[1] = (int)(Math.ceil((numsCopy[tail] - Math.floor(numsCopy[tail])) * 100)) + 1;
'' break;
'' }
'' }
''
'' return a;
'' }
</pre>

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

推荐阅读更多精彩内容

  • 日近花开走临春 百里芬芳一家茗 心忧已尽念佳人 苦去甘来茶一品 奈何缘尽无归处 生不逢时陌路人 痛不离愁相看去 待...
    龙婷音阅读 216评论 0 0
  • 心酸这个感觉其实是很微妙的。 我一直觉得心酸的感觉是比悲伤少一点,又比难过多一点。总是有一种无力感,不知道如何做才...
    浩瀚宇宙愿你我相伴阅读 265评论 0 1
  • 戏说水浒全目录 上回我们说到,那黑旋风李逵非但不承认在李俊寨中喝了酒,还要李俊背那招安精神。话说李俊等八位统领自打...
    这是文阅读 1,382评论 0 2