LeetCode解析(一):Two Sum

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
难度:easy

解析:在给定数组之中,得到两个数字,这两个数字之和等于给定数字,返回两数字的序号下标。由于题干中已经表明有且只有一组解,因此不用考虑很多异常情况,只需得到该答案即可。

方法一:穷举遍历(★★★)

最简单的方法就是穷举遍历,计算所有数字两两之和,直至得到答案。

class Solution {
    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){
                    return new int[] {i,j};
                }
            }
        }
        
        return null;
    }
}

结果:Runtime: 26 ms,beats 33.69% of Java submission.
备注:遍历数组,时间复杂度O(n^2),显然这个操作很一般。

方法二:Map筛选(★★★★)

添加map作为筛选条件。遍历给出的数组,对于任意数字nums[i],如果map中不包含nums[i],则将键值对(target-nums[i],i)置于map中,如果map中包含nums[i],则{i,map.get(nums[i])}为所求答案。
因为有且仅有一组解,假设a1,a2为这组解,则a1会先置于map中,且键值对为(target-nums[a1],a1),当遍历到nums[a2]时,可知map包含nums[a2](即 nums[a2] == target-nums[a1]),故可得答案为数组{a1,a2}。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        
        HashMap map = new HashMap();
        
        for( int i = 0 ; i < nums.length ; i++){
            if(map.containsKey(nums[i])){
                return new int[] { map.get(nums[i]) ,i};
            }else{
                map.put((target - nums[i]),i);
            }
        }
        return null;
    }
}

结果:Runtime: 4 ms,beats 90.71% of Java submission.
备注:遍历数组,时间复杂度O(n),同时使用HashMap进行key-value寻值,寻找这个唯一解。

方法三:数组筛选(★★★★★)----所有用户提交通过的答案中的最佳方法之一

此方法和方法二的思路基本一致,只不过方法二是使用map进行寻值,此方法是使用数组进行寻值。其主要思路如下,新建一个数组arr,保存未寻得配对的数字,保存方式:arr[ nums[ i ] ] = i。
遍历原数组nums,对于原数组任一数字nums[ i ],前往arr中寻值,如果arr[ target - nums[ i ] ] > 0,则代表目标值寻得,答案为{ i ,arr[ target - nums[ i ] ] },如果arr[ target - nums[ i ] ] == 0,为默认值,则代表目标值未插入arr,将当前值插入arr中。
备注:此方法有几个注意点,
(1)diff&max,nums[i]&max,这两处且运算是为了防止diff和nums[i]大于2048导致超界无法插入arr中;
(2)“ 如果arr[ target - nums[ i ] ] == 0,为默认值,则代表目标值未插入arr ”,这一结论并非绝对正确的,可能0就是目标值的位置,而不是默认值0,所以需要在一开始对nums[0]进行判断之后,arr[ target - nums[ i ] ] == 0才可以认为是默认值0.

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] arr=new int[2048];
        int max=arr.length-1;
        int first=nums[0];
        for(int i=1;i

结果:Runtime: 1 ms,beats 99% of Java submission.
备注:遍历数组,时间复杂度O(n),同时使用数组进行寻值,寻找这个唯一解。

你可能感兴趣的:(LeetCode解析(一):Two Sum)