给定一个整数数组,找出其中两个数相加等于目标值

原创:悦乐书 程序员小川

给定一个整数数组,找出其中两个数相加等于目标值

例如:给定数组及目标值 nums = [2,7,11,15] ,target = 9
因为nums[0] + nums[1] = 2 + 7 = 9
返回[0,1]
利用HashMap

解法一:

这道题目求的是数组内任意两元素之和等于给定的目标整数,于是很容易想到数组for循环遍历,并且是两层for循环,于是第一版的代码思路已经有了。

//java代码实现
private int[] findData(int[] array,int target){
   int[] result={-1,-1};
   HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
   for(int i=0;i<array.length;i++){
      map.put(array[i],i); 
     }

 for(int i=0;i<array.length;i++){
      int two = target-array[i];
     if(map.containKey(two)&&target!=2*two){
          result[0]=i;
         result[1]=map.get(two);
         break;
   }
 }
 retrurn result;
}
//Kotlin代码实现
fun twoSum1(nums: IntArray, target: Int): IntArray? {
            var result = IntArray(2)
            if (nums.size < 2)
                return null
            for (i in 0..nums.size-1) {
                for (j in i + 1..nums.size-1) {
                    if (nums[i] + nums[j] == target) {
                        result[0] = nums[i]
                        result[1] = nums[j]
                    }
                }
            }
            return result;
        }
解法二:

上面的解法是两层循环,循环次数是n*(n-1)次,n为数组元素个数,n越大,程序执行的时间越长,那能不能只循环一次?既然可以做加法匹配,那做减法呢?先拿到目标整数与数组中每位元素的差值,再去判断此差值是否存在于此数组中。这时,我们需要一个存新数据的集合,既包含每位元素,也包含每位元素的索引,对此选取Map作为存放新数据的对象。

 //java实现
 public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        int[] result=new int[2];
        for(int i=0;i<nums.length;i++){
            int value = target-nums[i];
            if(map.containsKey(value))
            {
               result[0]=i;
               result[1]=map.get(value);
                break;
            }          
            map.put(nums[i],i);
        }
        return result;
        
    }
//Kotlin实现
 fun twoSum2(nums: IntArray, target: Int): IntArray? {
            var result = IntArray(2)
            if (nums.size < 2)
                return null
            var map = HashMap<Int, Int>()
            for (i in 0..nums.size-1) {
                val k = target - nums[i]
                if (map.containsKey(k)) {
                    result[0] = nums[map.get(k)!!]
                    result[1] = nums[i]
                    break
                }
                map.put(nums[i], i)
            }
            return result
        }

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

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,788评论 0 33
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,087评论 19 139
  • 窗外,如约见了月光 一个被叫醒了的人 看见它圆润的、洁白脸庞 故乡是美的,一如 清晨做的这一个小梦。
    慕风夕阅读 168评论 0 4
  • 好久没有在这里写这里。原来。她和他又过了一关。其实每个月她们之间都有战斗的,可是不知道为什么这个月她们战斗多那。还...
    野蛮开心冬阅读 184评论 0 0