两数之和

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:
给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解法1:
简单直接,暴力搜索,时间复杂度是O(n^2);

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int n=nums.length;
        int sum[]=new int[2];
        for(int i=0;ifor(int j=i+1;jif(nums[i]+nums[j]==target){
                        sum[0]=i;
                        sum[1]=j;
                        return sum;
                    }
            }
        }
        return sum;
    }
} 

解法2:
使用map,把算法时间复杂度降为O(n) ,a+b=c ;a = c - b; 题目说明数组元素不会重复。Map的key为数组中的值,map的value为数组下标。当前数组是a时只需要找到key为b的值即可。(这算法值得好好想想)

public int[] twoSum(int[] nums, int target) {
        int[] sum = new int[2];
        Map map  = new HashMap<>(nums.length);
        for (int i = 0; i < nums.length; i++) {
            int value = target-nums[i];
            Integer index = map.get(value);
            if (index != null && index != i) {
               sum[0] = i;
                sum[1] = index;
                break;
            }
            map.put(nums[i],i);
        }
        return sum;
    }


BB一句:

注意时间复杂度。。。。

你可能感兴趣的:(leetcode--算法初级)