力扣第一题:两数之和


前言

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


一、题目

如何生成可参考右边的帮助文档给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。
在这里插入图片描述

二、使用步骤

1.自己写的

代码如下(示例):

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){
    
    
               int[] k = {
    
    i,j};
               return k;
           }
       }
   }
    return nums;
}

2.别人写的

代码如下(示例):

public int[] twoSum2(int[] nums,int target){
    
    
    int[] indexs = new int[2];

   // 建立k-v ,一一对应的哈希表
    HashMap<Integer,Integer> hash = new HashMap<Integer,Integer>();
    for(int i = 0; i < nums.length; i++){
    
    
        if(hash.containsKey(nums[i])){
    
    
            indexs[0] = i;
            indexs[1] = hash.get(nums[i]);
            return indexs;
        }
        // 将数据存入 key为补数 ,value为下标
        hash.put(target-nums[i],i);
    }
    return indexs;
}

这种方法肯定是更优的,它只用了一个for循环,用hashmap来替代了另外一个for循环
两个紧挨着的数字相比较就有个先后的问题,如果不考虑先后的话会导致自己和自己比较,这里的if比较就是相当于hash滞后了一步,该题的hash.put的位置也很关键,放在后面位置的话就是比较在前,放置函数在后,用旧的hash和新的nums[i]来作比较,永远是前一个和后一个比较,牛的。


总结

我觉得本质是对于要将一个数组遍历两遍的时候,可以看是否有这样的机会用目标减掉一个数,然后继续遍历你的数组,表面上只是减少了一次,但其实是次方的差距。

猜你喜欢

转载自blog.csdn.net/weixin_46646156/article/details/128414774