力扣1. 两数之和

方法2:哈希法

怎么想到的:在该数组中找出 和为目标值 target 的那 两个 整数,意思就是快速判断一个元素是否出现集合里,因此用哈希法。考虑用数组,set还是map,因为题目说的返回数组下标,因此我们要存入元素和下标,所以用map。遍历数组时,判断target-元素在map中是否存在,不存在则存入map。(这里有个小细节:key保存的元素值,value保存的元素下标。因为我们是通过target-元素这个值在map中获取下标,我们要返回的也是下标。)

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int a[]=new int[2];
       HashMap<Integer,Integer> map=new HashMap<>();
       //遍历数组
       for(int i=0;i<nums.length;i++)
       {
           //查找target减去每一个元素在map中是否存在
            int t=target-nums[i];
            //存在,存入这两个元素下标到a数组,终止循环
           if(map.containsKey(t))
              {
                  a[0]=map.get(t);
                  a[1]=i;
                 break;
              }
              //不存在,将这个元素存入map
              else
                  map.put(nums[i],i);
       }
       //返回数组
       return a;
    }
}

方法2:暴力法(最开始接触力扣时用C写的,就不加解释了)

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int j=0,k=0;
    for(j=0;j<numsSize-1;j++)
    {
     for(k=j+1;k<numsSize;k++)
     {
         if(nums[j]+nums[k]==target)
         {   int *ret=(int *)malloc(sizeof(int)*2);
             ret[0]=j;
             ret[1]=k;
             *returnSize=2;
             return ret;
         }
     }
    }
    *returnSize=0;
    return returnSize;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值