两数之和

题目
两数之和

解法

package 力扣;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 邓雪松 (づ ̄ 3 ̄)づ)
 * @create 2021-11-04-15-03
 */
public class 两数之和 {
    //自己的方法我就不写注释了
    public static int[] twoSum(int[] nums,int target){
        int length = nums.length;
        int bz = 0;
        int[] a = new int[2];
        for (int i = 0; i < length - 1; i++) {
            for(int j=i+1;j<length;j++){
                if(nums[i]+nums[j]==target){
                    a[0]=i;
                    a[1]=j;
                    bz=1;
                }
            }
            if(bz==1){
                break;
            }
        }
        return a;
    }

    //方法一:暴力枚举
    //思路及算法
    //最容易想到的方法是枚举数组中的每一个数x,寻找数组中是否存在target - x.
    //当我们使用遍历整个数组的方式寻找target - x时,需要注意到每一个位于x 之前的元素都已经和x匹配过
    //因此不需要在进行匹配。而每一个元素不能使用两次,所以我们只需要在x后面的元素中寻找target - x
    public static int[] twoSum2(int[] nums,int target){
        int n = nums.length;
        for (int i = 0; i < n; i++) {
            for(int j = i+1;j<n;j++){
                if(nums[i]+nums[j]==target){
                    return new int[]{i,j};
                }
            }
        }
        return new int[0];
    }
    //复杂度分析
    //时间复杂度:O(N方),其中N是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次
    //空间复杂度:O(1)

    //方法二:哈希表
    //思路及算法
    //注意到方法一的时间复杂度较高的原因是寻找target - x的时间复杂度过高。因此,我们需要一种更优秀的方法,
    //能够快速寻找数组中是否存在目标元素。如果存在,我们需要找出它的索引。
    //使用哈希表,可以将寻找target - x 的时间复杂度降低到从O(N)降低到O(1).
    //这样我们创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在target - x,然后将x插入到哈希表中
    //即可保证不会让x和自己匹配
    public static int[] twoSum3(int[] nums,int target){
        Map<Integer,Integer> hashtable = new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; i++) {
            if(hashtable.containsKey(target-nums[i])){
                return new int[]{hashtable.get(target-nums[i]),i};
            }
            hashtable.put(nums[i],i);
        }
        return new int[0];
    }
    //复杂度分析
    //时间复杂度:O(N),其中N是数组中的元素数量。对于每一个元素x,我们可以O(1)地寻找target - x.
    //空间复杂度:O(N),其中N是数组中的元素数量。主要为哈希表的开销。
    public static void main(String[] args) {
        int[] a = {1,2,3,4,5,6};
        int target = 9;
        int[] b = new int[2];
        b = twoSum3(a,target);
        for (int i = 0; i < 2; i++) {
            System.out.print(b[i]+" ");
        }
    }
}
上一篇:1.两数之和-LeetCode题解


下一篇:看动画学算法之:hashtable