每天争取一道算法题——两数之和

题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum

这个题是简单题,第一个想到的就是暴力求解。我的思路是双指针(自己命名的):两个指针i和j,初始值i=0,j=1;用j遍历整个数组,判断nums[i]+nums[j]==0,如果为真,则返回i和j的值,如果为假,则j继续后移,直至最后;i往前移动一个位置,继续用j遍历整个数组,同时j的初始位置为i+1,重复上述操作。

input: i=0, j=1,int []nums
output:new int[]{i,j}
1:使用j遍历数组,判断nums[i]+nums[j]是否为0,如果为0,转至3;不为0,转至2;
2:i向前一个位置,同时j=i+1;转至1;
3:返回new int[]{i,j};

下面是用java实现上述算法描述:

 public int[] twoSum(int[] nums, int target) {
    
    
         for(int i=0;i<nums.length;i++){
    
    
             int j=i+1;
             while(j<nums.length){
    
    
                  if(nums[i]+nums[j]==target)
                    return new int[]{
    
    i,j}; 
                  j++;
             }
         }
         return null;
     }

写完以后,在想有没有优化的空间,现在算法的时间复杂度是O(n^2),算法不是很高效。以前做题总是做出来就行了,但是现在不是为了刷题而刷题,本着探究的精神,当然不会满足一种解法,但是奈何脑瓜子不行,参考了leetcode的官方解答。

它的方法是使用哈希表,当访问到数组的某一个位置k时,判断哈希表中是否存在target-nums[k]这个值,如果存在,直接返回,如果不存在,则将位置k对应的值存入哈希表作为键,同时将位置信息存入作为值。不得不说,妙啊。
写下算法,复盘一下

input: i=0,int []nums,a=new HashMap();
output:new int[]{i,a.get(target-nums[i])}
1:访问数组位置i,如果位置i对应的nums[i]值等于target-nums[i],转至3;否则转至2
2:将nums[i],i存入哈希表中;转至1;
3:返回new int[]{i,a.get(target-nums[i])};

下面是用java实现的代码描述

   public int[] twoSum(int[] nums, int target) {
    
    
         Map<Integer,Integer> a=new HashMap();
         int length=nums.length;
         for(int i=0;i<length;i++){
    
    
             if(a.containsKey(target-nums[i]))
                return new int[]{
    
    i,a.get(target-nums[i])};
             a.put(nums[i],i);

         }
         return null;

     }

猜你喜欢

转载自blog.csdn.net/weixin_43763175/article/details/109500252