Two Number

Two Number
给定一个整数数组,返回两个数字的索引,使它们相加到特定目标。

您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素。
示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解题思路:首先创建一个HashMap,遍历数组中的元素将数组元素以及元素索引存在Map中,然后再次遍历数组中元素,求出该元素num1对应的差值num2,再查看num2是否存在于key的集合中如果存在那么查找num2的索引值num2_index,可能存在特殊情况如:数组[3,2,4] target=6,因为3的差值仍然为3所以需要判断num2_index和i是否相同,如果相同说明是同一个元素不符合要求,如果不相同说明不是同一个元素可以设置到结果数组中

附上代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] result=new int[2];
        HashMap<Integer,Integer> map=new HashMap();
       for(int i=0;i<nums.length;i++)
       {
           map.put(nums[i],i);
       }
        for(int i=0;i<nums.length;i++)
        {
            int num1=nums[i];
            int num2=target-num1;
            int num2_index;
            //这里用&&比使用两个if效率更高
            if(map.containsKey(num2)&&(num2_index=map.get(num2))!=i)
            {
                 result[0]=i;
                 result[1]=num2_index;   
                    return result;
                
            }
        }
        return null;
    }
}

时间复杂度分析:HashMap在不发生冲突的情况下也就是最理想情况下,get、put方法的时间复杂度都是O(1),HashMap在发生冲突的时候时间复杂度应该是O(n),所以按最理想情况来看该算法的时间复杂度为O(n)

猜你喜欢

转载自blog.csdn.net/qq_36059306/article/details/83989581
two
今日推荐