Two Sum(两个数的相加)

2017.11.10

题目描述:Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].解题思路:1.暴力解法强行判断nums[i]+nums[j]==target
    /**
    *暴力解法,时间复杂度是O(n^2)
    */
    public int[] twoSum(int[] nums, int target) {
        for(int i=0;i<nums.length;i++){
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]+nums[j]==target){
                    return new int[]{i,j};
                }
            }
        }
        throw new IllegalArgumentException("no such num!");
    }

2.利用hashMap的key-value特性

a.为数组建立索引
b.在索引中查找有没有target-nums[i]的key,并且满足不是数的本身

/**
*利用hashMap的查找元素的时间复杂度为O(1)
*总的时间复杂度是2O(n),即O(n),空间复杂度是O(n)
*/
public int[] twoSum(int[] nums, int target) {
       Map<Integer,Integer> map= new HashMap<Integer,Integer>();
        for(int i=0;i<nums.length;i++){
            map.put(nums[i],i);
        }
        for(int i=0;i<nums.length;i++){
            int num=target-nums[i];
            //判断map中是否有这个数,并且这个数不是目前这个数
            if(map.containsKey(num)&&map.get(num)!=i){
                return new int[]{i,map.get(num)};
            }
        }

        throw new IllegalArgumentException("no such num!");
    }

3.map中找到就中止

a.先判断map中有没有这个数

b.如果有,则直接返回

    public int[] twoSum(int[] nums, int target) {
       Map<Integer,Integer> map= new HashMap<Integer,Integer>();
       for(int i=0;i<nums.length;i++){
       int num = target-nums[i];
       if(map.containsKey(num)){
           return new int[]{map.get(num),i};
       }
           map.put(nums[i],i);
   }

        throw new IllegalArgumentException("no such num!");
    }
时间: 2024-10-05 10:53:16

Two Sum(两个数的相加)的相关文章

shell实现两个数的相加

刚开始的时候写,一直写不对:看似简单的功能,但是一定要小心:函数的定义: funciton functionName {.....}在functionName和{之间一定有空格啊! 我就是没加空格,就一直报错. 实现两个数相加: #! /usr/bin/ksh function add { if (( $# < 2 )); then echo "The arg in't correct" else sum=$(($1+$2)) echo $sum fi } add 1 add 1

lintcode 中等题:2 Sum 两个数的和

题目 两数之和 给一个整数数组,找到两个数使得他们的和等于一个给定的数target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是1到n,不是以0开头. 样例numbers=[2, 7, 11, 15], target=9 return [1, 2] 注意你可以假设只有一组答案. 解题 题目之前做LeetCode时候写过这个,利用这里利用ArrayList,当 target- numbers[i] 不在 list中,把numbers[i

Scanner 输入---从键盘输入两个数进行相加

1 import java.util.Scanner;//scanner 是包含在Java.util中的:使用的时候需要调用 2 3 /** 4 * 测试Scanner类的使用.如何接受键盘的输入 5 * @author ZBG34854 6 * 7 */ 8 public class TestScanner { 9 public static void test01(){ 10 Scanner s = new Scanner(System.in); 11 String str = s.next

leetcode 1: 找出两个数相加等于给定数 two sum

问题描述 对于一个给定的数组,找出2个数,它们满足2个数的和等于一个特定的数,返回这两个数的索引.(从1开始) 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,

实现两个数相加不用四则运算

分析:实现两个是相加不用四则运算,根据计算机中的运算不用四则运算那么肯定是位运算了. (以下分析来自剑指offer)比如我们计算5+17=22这个结果,世界上,我们可以分为3个步骤计算,第一步各位数相加不进位,此时的结果是12(个位相加不进位是2,十位相加是1),所以结果是12: 第二步做进位,5+7有进位,进位值是10:第三步是把前两步计算结果加起来.12 + 10 = 22. 那么运用位运算二进制的数字也可以这么考虑,5是二进制的101,17是二进制的10001.试着把计算分为3步走,第一步

相加等于100的两个数

大致题意:有一个整数数组,找出其中所有相加等于100的两个数. 方法一:用两个for循环. 时间复杂度为o(n^2) 方法二:先排序 将最小的与最大的相加 若和小于100,则将最小的去掉 若和等于100,则把两个数输出 若和大于100,则把最大的去掉 时间复杂度为o(n*logn)+o(n)=o(n*logn) N:当有多个相同的数字时,不知道怎么弄 不知道有没有更好的方法.!!

一个数组中找到满足和为sum的两个数

如果考虑hashmap直接O(n)的速度, 如果不行,就先排序,两头指针很好推理,关键是 a[beg] +a[end]>sum,意思就是说a[end]太大了,最小的数的都不满足,所以排除a[end] 绝知此事要躬行 #include<iostream>#include<algorithm>using namespace std; bool find(int *a,int sum,int len,int &ans1,int &ans2){    int *beg

2-36进制的 两个数相加

最近在很多场合都看见设计模式的影子,一直以来,都投入主要时间在搞算法与数据结构,很来发现设计模式真的很重要.有的时候代码的可维护.可重用.可扩展确实胜过单纯的算法效率高.所以拾起大牛书籍<大话设计模式>同时参考网上诸大牛的博客,开始我的设计模式之旅.由于平时编程时用C/C++,现在是Java,也练练Java语法. 今天先介绍一下命令模式. 概念: 命令模式(Command):将一个请求封装成一个对象,从而使你可用不同的请求对象对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作.

[LeetCode]1. 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